题意:
一组价值从1到6的弹珠,每个价值对应输入相应的个数,判断能否平均分为两组
要点:
简单DFS,一开始我直接套用模板超时了,主要原因是我又重新设了一个数组想储存这些对应的价值,这肯定就慢了,其实不需要,对应的i就是价值,所以直接dfs就可以
PS:看网上一般都是用背包问题做的,下次研究一下换种方法再做一遍
代码如下:
#include<stdio.h>
#include<string.h>
int n[7];
int num, sum, tot;
bool dfs(int len,int pos)//因为只要两个简单一些
{
int i;
if (len== tot)
return true;
for (i = pos; i >= 1; i--)
{
if (n[i])//判断是否为0
{
if (len + i <= tot)//等于也放在这里,方便一些
{
n[i]--;
if (dfs(len + i, i))//也可以包括等于
return true;
}
}
}
return false;
}
int main()
{
int i, ans = 0;
while (1)
{
sum = 0, num = 0;
for (i = 1; i <= 6; i++)
{
scanf("%d", &n[i]);
num += n[i];
sum += n[i] * i;
}
if (num == 0)
break;
printf("Collection #%d:\n", ++ans);
if (sum % 2) //奇数剪掉
{
printf("Can't be divided.\n");
}
else
{
tot = sum / 2;
if (dfs(0, 6)) //从最大的开始所以从6开始
printf("Can be divided.\n");
else
printf("Can't be divided.\n");
}
printf("\n");
}
return 0;
}