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 }
View Code

 

posted @ 2016-09-06 14:05  Bloodline  阅读(165)  评论(0编辑  收藏  举报