1. 程式人生 > >【BZOJ】【P2073】【POI2004】【PRZ】【題解】【狀壓DP+列舉子集】

【BZOJ】【P2073】【POI2004】【PRZ】【題解】【狀壓DP+列舉子集】

狀壓DP+列舉子集

Code:

#include<bits/stdc++.h>
using namespace std;
int n,W;
int w[18],t[18];
int dp[1<<16],sum[1<<16],tim[1<<16];
int main(){
	cin>>W>>n;
	for(int i=1;i<=n;i++)cin>>t[i]>>w[i];
	for(int i=1;i<(1<<n);i++){
		for(int j=1;j<=n;j++){
			if(i>>(j-1)&1){
				sum[i]+=w[j];
				tim[i]=max(tim[i],t[j]);
			}
		}	
	}
	for(int i=1;i<(1<<n);i++){
		dp[i]=2333333;
		for(int j=i;j;j=i&(j-1))
		if(sum[j]<=W)dp[i]=min(dp[i],tim[j]+dp[i^j]);
	}cout<<dp[(1<<n)-1]<<endl;
	return 0;
}