有价值为 1 - 6 的物品分别为 N1 - N6 件,问能否平分这些物品使得两部分的价值和相同。
网上基本都说是多重背包,但是我没写过不太会,就写了个暴力水了水。
#include <cstdio>
using namespace std;
int n[7], sum, t = 0;
bool flag = 0;
void dfs(int v, int x)
{
if(flag) return;
if(v == sum){ flag = 1; return; }
for(int i = x; i >= 1; i --)
if(n[i] && v + i <= sum){
n[i]--;
dfs(v + i, i);
if(flag) break;
}
return;
}
void doit()
{
flag = 0;
if(sum % 2 == 1){
printf("Collection #%d:\nCan't be divided.\n", t);
return;
}
sum /= 2;
dfs(0, 6);
if(flag) printf("Collection #%d:\nCan be divided.\n", t);
else printf("Collection #%d:\nCan't be divided.\n", t);
}
int main()
{
while(scanf("%d%d%d%d%d%d", &n[1], &n[2], &n[3], &n[4], &n[5], &n[6]) != EOF){
sum = 0; ++ t;
for(int i = 1; i <= 6; i ++) sum += n[i] * i;
if(sum == 0) break;
doit(); printf("\n");
}
return 0;
}