刚开始,将输入的每种价值的大理石都%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;
}