您的位置:首页 > 其它

POJ 1014.Dividing(DFS)

2015-07-27 14:44 295 查看
2015-06-07
问题简述:

  有六样物品,其值分别为1,2,3,4,5,6,现在有一部分这些物品,需要把这些物品分为两部分,输出是否能让这两部分的值总和相等。

  原题链接:http://poj.org/problem?id=1014

解题思路:

  显然可以将所有物品值的总和加起来,以总和的一半为一个背包的限额,可以将这个问题转化为多重背包问题。但是这里我要使用另外一种方法----DFS。

  DFS:从最大值为6开始向下深搜,由于值为6的物品可能有很多个,所以下一个搜索仍然从6开始(当值为6的物品用完时,继续向下搜索)。

源代码:

/*
OJ: POJ
ID: 3013216109
TASK: 1014.Dividing
LANG: C++
NOTE: DFS
*/
#include <cstdio>

int n[6],k=1,sum;

bool dfs(int x) {
if(x==sum/2) return true;
for(int i=5;i>=0;i--) {
if(n[i]&&x+i+1<=sum/2) {
n[i]--;
if(dfs(x+i+1))
return true;
}
}
return false;
}

int main()
{
while(scanf("%d",&n[0])!=EOF) {
sum=n[0];
for(int i=1;i<6;i++) {
scanf("%d",&n[i]);
sum+=(n[i]*(i+1));
}
if(sum==0) break;
printf("Collection #%d:\n",k++);
if(sum%2==1) {
printf("Can't be divided.\n\n");
continue;
}
if(dfs(0))
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: