bzoj2073: [POI2004]PRZ
我不会枚举子集。。
首先for (x = S; x ; x = (x-1)&S)可以枚举一个集合S的所有子集
然后可以证明枚举N个元素的子集的子集的复杂度是3^n(QAQ自己觉得是4^n所以一开始不会做...太弱...)
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define rep(i,l,r) for(int i=l;i<=r;++i) 5 using namespace std; 6 int n,m,t[20],v[20],two[20],all,f[1023333],ti[1023333],w[1023333]; 7 int main(){ 8 scanf("%d%d",&m,&n); 9 rep(i,1,n) scanf("%d%d",&t[i],&v[i]); 10 two[0]=1;rep(i,1,20) two[i]=two[i-1]*2; 11 all=two[n]-1; 12 memset(f,60,sizeof f); f[0]=0; 13 rep(i,1,all) rep(j,1,n) if(two[j-1]&i) w[i]+=v[j],ti[i]=max(ti[i],t[j]); 14 rep(S,1,all) for(int x=S;x;x=(x-1)&S) if(w[x]<=m) f[S]=min(f[S],f[S-x]+ti[x]); 15 printf("%d\n",f[all]); 16 }