POJ1014 DFS
2015-12-20 15:24
330 查看
题意:
一组价值从1到6的弹珠,每个价值对应输入相应的个数,判断能否平均分为两组
要点:
简单DFS,一开始我直接套用模板超时了,主要原因是我又重新设了一个数组想储存这些对应的价值,这肯定就慢了,其实不需要,对应的i就是价值,所以直接dfs就可以
PS:看网上一般都是用背包问题做的,下次研究一下换种方法再做一遍
代码如下:
一组价值从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; }
相关文章推荐
- 整合了刷新、加载更多、滑动删除功能的XListview
- Cpp--getch(),getche(),getchar()的区别
- 【杭电】[2035]人见人爱A^B
- 使用Microsoft Translator进行翻译
- HTML表单
- Ants(思维)
- 仿网易新闻APP(四)——标题栏之本市天气(百度定位与车联网之天气查询)
- Sping Boot 初探(一)--- 一分钟构建SpringWeb
- I/O端口和I/O内存--学习备忘
- CPP入门(3):输入、输出
- 软件工程实践总结作业——个人作业
- 5秒返回页面
- 判断数组中的重复元素
- Win7 Eclipse调试Centos Hadoop2.2-Mapreduce(转)
- 仿网易新闻APP(三)——标题栏之24小时要闻
- sbt创建web项目
- android intent 跳转到第三方应用 如果第三方应用已经启动,但是隐藏在home下,如何让它显示出来?
- 《实时控制软件设计》第三次作业
- 文件API-----API 是什么文件
- HTML5拖放API(相关重点)