1 #include<stdio.h>
2 int max(int x,int y)
3 {
4 if (x>y) return x;
5 return y;
6 }
7 int v[105],w[105],ans[1000005];
8 int main()
9 {
10 int t=0,f[10],er[20],i,j,sum,zz,dd;
11 while (~scanf("%d%d%d%d%d%d",&f[1],&f[2],&f[3],&f[4],&f[5],&f[6])
12 &&(f[1]!=0||f[2]!=0||f[3]!=0||f[4]!=0||f[5]!=0||f[6]!=0))
13 {
14 er[0]=1;
15 for (i=1;i<=15;i++) er[i]=2*er[i-1];
16 sum=0; zz=0;
17 for (i=1;i<=6;i++)
18 {
19 zz+=i*f[i]; dd=0;
20 while (f[i]>=er[dd])
21 {
22 sum++;
23 v[sum]=i*er[dd];w[sum]=er[dd];
24 f[i]-=er[dd]; dd++;
25 }
26 if (f[i]!=0) {sum++;v[sum]=i*f[i]; w[sum]=f[i]; f[i]=0; }
27 }
28 // for (i=1;i<=sum;i++) printf("%d ",v[i]); printf("\n");
29 t++; printf("Collection #%d:\n",t);
30 if (zz%2==1) {printf("Can't be divided.\n\n"); continue; }
31 zz=zz/2;
32 ans[0]=0; for (i=1;i<=zz;i++) ans[i]=-0x3f3f3f3f;
33 for (i=1;i<=sum;i++)
34 for (j=zz;j>=v[i];j--)
35 ans[j]=max(ans[j],ans[j-v[i]]+w[i]);
36 if (ans[zz]>0) printf("Can be divided.\n\n");
37 else printf("Can't be divided.\n\n");
38 }
39 }
http://acm.hdu.edu.cn/showproblem.php?pid=1059