Description
Input
The last line of the input file will be "0 0 0 0 0 0"; do not process this line.
Output
Output a blank line after each test case.
Sample Input
1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0
Sample Output
Collection #1: Can't be divided. Collection #2:Can be divided.
//为什么不需要回溯? //从后往前递归,则前面的数可表示出后面的数,保留可表示性多的数 (贪心) // 题目可以理解为:是否存在x1,x2,x3,x4,x5,x6,并且x1,x2...x6 的值小于或等于题目所给的值, // 使得X1 + 2*X2 + 3*X3 + 4*X4 + 5*X5 + 6*X6 ==SUM/2; // 证明为什么不需要回溯: // 假设存在某次回溯的情况使得答案正确,也就是说 // 则说明存在X1+2*X2+3*X3+4*X4+5*X5+6*(X6-1)=(SUM/2)= t + 6; // 也就是1至5中存在某个组合使得 x?*? + x?*?=6 即6可由前面的表示,t也可以用前面的表示 // 即然t可以表示,那么反过来就可以保留6了 #include<stdio.h> int flag; int a[7]; int sum,half; void dfs(int num,int pos) { if(flag==1) return; if(num==half) { flag=1; return; } for(int i=pos;i>=1;i--) if(a[i]>0 && num+i<=half) { a[i]--; dfs(num+i,i); } } int main() { int count=0; while(1) { flag=0; sum=0; for(int i=1;i<7;i++) { scanf("%d",&a[i]); sum=sum+a[i]*i; } if(!sum) break; printf("Collection #%d:\n",++count); if(sum%2) { printf("Can't be divided.\n\n"); continue; } half=sum/2; dfs(0,6); if(flag==1) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } return 0; }