void dp() { int i; for(i=1; i<=n; i++) MultiplePack(cv[i], cv[i], num[i]); }
int main() { int i,t; int sum; for(t=1;1;++t) { scanf("%d %d %d %d %d %d",lst+1,lst+2,lst+3,lst+4,lst+5,lst+6); sum=lst[1]+lst[2]*2+lst[3]*3+lst[4]*4+lst[5]*5+lst[6]*6;//价值和 if(sum==0) break; printf("Collection #%d:\n",t); if(sum%2)//价值和为奇数,不可分 { printf("Can't be divided.\n\n"); } else { V=sum/2;//目标价值 memset(F,0,(V+1)*sizeof(int)); // 多重背包 for(i=1;i<=6;++i) { if(lst[i]!=0)//有弹珠 { MultiplePack(i,i,lst[i]);//费用与价值合一,固V费用应该得到V的价值 } } if(F[V]==V)//V的容量的目标价值为V printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } } return 0; }
int main(){ int i, j, t=1, a[10], sum; while(scanf("%d%d%d%d%d%d%d%d%d%d",&a[1],&a[2],&a[3], &a[4],&a[5],&a[6],&a[7],&a[8],&a[9],&a[10])) { if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0 &&a[6]==0&&a[7]==0&&a[8]==0&&a[9]==0&&a[10]==0) break;//结束条件 sum = 0 ; j = 1; for (size_t i = 1; i <= 10; i++) { sum += a[i] * i; if (a[i]) { w[j] = i; n[j] = a[i]; j ++; } } printf("#%d:",t ); if(sum % 2 == 1) printf("Can't be divided.\n" ); else { V = sum / 2; memset(f,0,sizeof(f)); for (size_t i = 1; i < j; i++) { MultiplePack(w[i],w[i],n[i]); } if (f[V] == V) printf("Can be divided.\n"); else printf("Can't be divided.\n"); } printf("\n" ); t++; /* code */ } return 0; }