zoj 1149 Dividing
刚开始,将输入的每种价值的大理石都%2。以为是剪枝,后来和同学交流才发现,当数据为 0 0 2 0 0 1 是错误的。改了一下代码才AC。下次不要犯这些小错误了……
#include "stdio.h" #include "string.h" //ave每个人应该获得大理石价值 //a1-a6记录各种大理石数量 //flag状态标记,1为可以均分,0为不可以 int ave,a[7],flag; void find(int ans,int s)//ans当前总和,s开始搜索的大理石价值 { int i; if(flag) return; if(ans==ave)//达成目标返回 { flag=1; return; } for(i=s; i>=1; i--) { if(a[i]) { if(ans+i<=ave) { a[i]--; find(ans+i,i);//进行下一次搜索 if(flag) break;//找到答案,结束循环 } } } return; } int main() { int i,cas=0,sum,max; while(~scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])) { cas++; sum=0; if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0) break; printf("Collection #%d:\n",cas); flag=0; for(i=1; i<=6; i++) sum+=i*a[i];//计算大理石总和 if(sum%2!=0)//剪枝,sum为奇数排除 { printf("Can't be divided.\n\n"); continue; } ave=sum/2; find(0,6);//开始搜索 if(flag==1) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/