题意:
一组价值从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");elseprintf("Can't be divided.\n");}printf("\n");}return 0;
}