hdu 1059 Dividing (多重背包)
来源:互联网 发布:三菱plc如何编程视频 编辑:程序博客网 时间:2024/06/04 19:52
/*多重背包*/#include<iostream>#include<cstring>#include<cstdio>#define max(a,b) a>b?a:b#define N 60001using namespace std;int a[7],sum,index;char f[N];int main(){ freopen("test.txt","r",stdin); index=0; while(true) { sum=0; for(int i=1;i<=6;i++) { scanf("%d",&a[i]); sum+=a[i]*i; } if(!sum) break; printf("Collection #%d:\n",++index); if(sum%2!=0) { printf("Can't be divided.\n"); } else { sum/=2; memset(f,0,sizeof(f)); f[0]=1; for(int i=1;i<=6;i++) { if(a[i]*i>=sum) { for(int j=i;j<=sum;j++) { f[j]|=f[j-i];//这里省时。 } } else { int k=1; while(k<a[i]) { for(int j=sum;j>=k*i;j--) { f[j]|=f[j-k*i]; } a[i]-=k; k*=2; } k=a[i]; for(int j=sum;j>=k*i;j--) { f[j]|=f[j-k*i]; } } } if(f[sum]) printf("Can be divided.\n"); else printf("Can't be divided.\n"); } printf("\n"); }}