【BZOJ】【P2073】【POI2004】【PRZ】【題解】【狀壓DP+列舉子集】
阿新 • • 發佈:2019-01-01
狀壓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; }