题意:有六种大理石分别是1,2,3,4,5,6,代表其价值。现在给你每一种的数量。问你是否能分成平均两半。
很明显要用搜索,刚刚开始我竟想的很简单用普通方法写,突然明白不是简单的从小加到一半。dfs可以遍历所有情况。如果某一种情况不行就回溯回来。我写完之后一直超时。后来发现多了一步。a[i]++,其实现在想了不能再自加恢复原来了,因为每一种情况dfs又会在一个for循环中遍历很多情况如果某一种情况不行,便可以由a[i]--而退回。
#include<cstdio>
int sum;
int flag;
int a[8];
void dfs(int s,int value)
{
if(value == sum){ //出口
flag = true;
return ;
}
if(flag)
return ;
for(int i = s;i >= 1; i--){
if(a[i]){
if(i + value <= sum){ //此处太妙
a[i]--;
dfs(i,value+i);
//a[i]++; //这里是坑啊,不必恢复,因为循环
if(flag)
return ;
}
}
}
return ;
}
int main()
{
// freopen("in.txt","r",stdin);
int ncase = 1;
while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]) != EOF){
if(a[1] == 0 && a[2] == 0 && a[3] == 0 && a[4] == 0 && a[5] == 0 && a[6] == 0)
break;
printf("Collection #%d:\n",ncase++);
sum = 0;
for(int i = 1;i <= 6; i++)
sum += a[i]*i;
if(sum%2 == 1){
printf("Can't be divided.\n\n");
continue;
}
sum /=2;
flag = false;
dfs(6,0);
if(flag)
printf("Can be divided.\n");
else
printf("Can't be divided.\n");
printf("\n");
}
return 0;
}