poj1011 && uva307 DFS + 剪枝
2024-10-19 00:20:06
将木棒从大到小排列,保证每次的选择都是最长可选的木棒。
剪枝:
1 . 如果第 i 根木棒被选择却无法成功拼接,那么后面与其长度相同的也不能选择。
2 . 如果第 cnt + 1 根木棒无法成功拼接,就应该立即重构第 cnt 根木棒。那么如何判断是否能构造木棍呢?每次可以选择的最长木棒必须要选择,因为就算这次不选择,后面木棒的拼接也要用到该木棒,如果不能利用该木棍直接返回构造上一根木棍。
3 . 如果现在加入长度为x的一节木棒刚好组成一节完整的木棒,但是后面的木棍不能成功拼接,就重新选取上一节木棍,改变最后需要的长度x。
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 100; int len[maxn], vis[maxn], n; bool cmp(int a, int b){ return a > b; } int Len, Cnt; //长度和数量 bool dfs(int cnt, int cur, int lenth){ if(cnt == Cnt) return true; for(int i = cur; i < n; ++i){ if(vis[i] || lenth + len[i] > Len) continue; if(lenth + len[i] < Len){ vis[i] = 1; if(dfs(cnt, i + 1, lenth + len[i])) return true; vis[i] = 0; if(lenth == 0) return false; while(len[i + 1] == len[i] && i < n) ++i; //len[i]没有被选择 } else if(lenth + len[i] == Len){ //拼成1根 vis[i] = 1; if(dfs(cnt + 1, 0, 0)) return true; vis[i] = 0; return false; } } return false; } int main(){ while(scanf("%d", &n) == 1 && n){ memset(vis, 0, sizeof(vis)); int sum = 0; for(int i = 0; i < n; ++i){ scanf("%d", &len[i]); sum += len[i]; } sort(len, len + n, cmp); //根据长度降序排序 for(Len = len[0]; Len <= sum; ++Len){ if(sum % Len) continue; Cnt = sum / Len; if(dfs(0, 0, 0)) { printf("%d\n", Len); break; } } } return 0; }
如有不当之处欢迎指出!
最新文章
- 一文弄懂神经网络中的反向传播法——BackPropagation
- Ip 地址
- Java获取音频文件(MP3)的播放时长
- linux php安装扩展方法 查找配置文件
- winform布局格式
- Qt 内存泄漏测试
- input模糊搜索功能
- java 泛型基础问题汇总
- [Python Study Notes]Socket模拟ssh执行cmd并记录遇到的问题
- AsyncTask原理
- WebSocketSharp 的使用
- 纯css美化下拉框、复选框以及单选框样式并用jquery获取到其被选中的val
- 校验XX是否在有效期内
- 垃圾wps弹出,现在连关闭按钮都不给了
- GitHub学习总结
- Spring的后置处理器BeanFactoryPostProcessor
- Win10传递优化设置技巧
- 20135119_涂文斌 实验二 Java面向对象程序设计
- Big Number-Asia 2002, Dhaka (Bengal) (计算位数)题解
- vim---打造Python IDE
热门文章
- 在CMainFrame里使用定时器是有讲究的
- 在Intellij IDEA 中clean报错:-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
- 一个ios的各种组件、代码分类,供参考
- java获取昨天的日期
- zabbix_sender用法实例
- c# 事件路由器
- [C#] 《Concurrency in C# Cookbook》读书笔记(一)- 并发编程概述
- Electron应用使用electron-builder配合electron-updater实现自动更新(windows + mac)
- 【C++】bazel的使用
- Python字典(dict)使用技巧