POJ 1011 Sticks(搜索 && 剪枝 && 经典)
2024-09-05 20:05:42
题意 : 有n根木棍(n<=64),它们由一些相同长度的木棍切割而来,给定这n根木棍的长度,求使得原来长度可能的最小值。
分析 : 很经典的深搜题目,我们发现答案只可能是所有木棍长度总和的因数,那么我们只要去枚举因数然后搜索是否可行即可!具体实现看代码可能更容易看懂,这里不赘述。重要的是体会此类深搜的代码构建过程以及剪枝的考虑的巧妙性!
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; + ; bool vis[maxn]; int sticks[maxn]; int CurLen; int n; int Remain;///每一次都去重置为 bool DFS(int id, int Lack)///传入的参数为上次选择了哪个木棍、当前还缺多少才能组成一个新的目标木棍 { ){///已经组成一个新的木棍了, Remain -= CurLen; ) return true;///如果当前总长为0,说明此方案可行! int which; ; vis[which]==true; which++);///由于是排好序,我们取第一个没有使用过的木棍开始下一次的搜索 vis[which] = true;///标记 if( DFS(which, CurLen-sticks[which]) ) return true;///开始新一轮搜索 vis[which] = false;///记得标记回来 Remain += CurLen;///赋值回来!搜索题代码应当注意的地方! }else{ for(int i=id; i<n; i++){ && (sticks[i]==sticks[i-] && !vis[i-])) continue;///剪枝:排序后,如果有数字不能返回true,说明在此刻选 ///择同样的数字也是一样的结果,所以跳过 if(vis[i] || Lack < sticks[i]) continue; Lack -= sticks[i]; vis[i] = true; if( DFS(i, Lack) ) return true; Lack += sticks[i]; vis[i] = false; if(sticks[i] == Lack) break;///剪枝:如果当前if成立,说明刚刚的DFS肯定是 ///到达过Lack==0的,既然不返回true,那么说明 ///此方案不行,不必继续往下面搜下去了! } } return false; } bool cmp(int fir, int sec){ return fir > sec; } int main(void) { while(~scanf("%d", &n) && n){ ; ; i<n; i++){ scanf("%d", &sticks[i]); tot += sticks[i];///累计总和 vis[i] = false; } sort(sticks, sticks+n, cmp);///排序方便剪枝 bool ok = false; ]; Len<=tot/; Len++){ ){ Remain = tot;///将Remain重置,代表当前搜索状态下总长度还剩多少,如果为0说明成功 CurLen = Len;///全局变量记录当前枚举的是哪个因数,方便深搜操作 , Len)){ printf("%d\n", Len); ok = true; break; } } } if(!ok) printf("%d\n", tot); } ; }
最新文章
- JSON与String 格式的转换
- javascript 时间代理
- Python time datetime常用时间处理方法
- [BTS] Error biztalk arguments null exception string reference not set to an instance of a string. parameter name
- android媒体文件扫描
- Git Fast-forward提交
- repeater做删除前弹窗询问
- js避免全局污染
- SRM 582 Div II Level Three: ColorTheCells, Brute Force 算法
- make deb for debian/ubuntu, package software for debian/ubuntu
- sqllite小型数据库的使用
- 第一周-JAVA基本概念
- Jmeter之正则表达式提取器应用
- docker 搭建 hustoj
- 设计模式之责任链模式(Chain of Responsibility )
- ARM Linux Oops使用小结(转)
- Go Example--变量
- (A - 整数划分 HYSBZ - 1263)(数组模拟大数乘法)
- Centos 的计划任务 crontab
- bzoj 2555
热门文章
- python string_2 内建函数详解
- LeetCode.872-叶子值相等的树(Leaf-Similar Trees)
- 【Linux开发】Linux下jpeglib库的安装详解
- 第五周课程总结&;实验报告(三)
- Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)
- python 如何解决高并发下的库存问题??
- 利用AXI-DMA批量发送数据到DMA
- Windows Server 2016 安装.NET Framework 3.5 错误
- linux中几个简单的系统命令(还有一些其他杂项命令)
- js中的object类型