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的物品用完时,继续向下搜索)。
源代码:
问题简述:
有六样物品,其值分别为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; }
相关文章推荐
- POJ 3368.Frequent values(RMQ和线段树)
- Android百度地图的简单实现
- Laravel5 学习与使用(一)
- PHP-购物网站开发设计(一)
- PHP-购物网站开发设计(二)
- POJ 2442.Sequence
- HDOJ 1308.Is It A Tree?
- Objective-C中@property的所有属性详解
- 每天一道算法题(25)——字符串中连续出现次数最多的子串
- hdu 1203 I NEED A OFFER!(01背包)
- 每天一道算法题(25)——字符串中连续出现次数最多的子串
- 判断是否是在手机登陆
- ds.Merge 与 ds.Tables[0].Merge 的用法
- 微信公众号开发之微信模板消息
- 修改用户密码引来的一系列麻烦
- 3.7-磁盘格式化 mke2fs
- iOS自学---彩票App第一天
- 【leetcode c++】104 Maximum Depth of Binary Tree
- 浮点数转换成字符串函数
- error code '1064' MySql中报错