poj 1011 Sticks ,剪枝神题
来源:互联网 发布:淘宝差评最多的东西 编辑:程序博客网 时间:2024/04/30 00:57
木棒
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 118943 Accepted: 27429
Description
乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。
Input
输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后共有多少节木棍。第二行是截断以后,所得到的各节木棍的长度。在最后一组数据之后,是一个零。
Output
为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。
Sample Input
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
Sample Output
6
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 118943 Accepted: 27429
Description
乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。
Input
输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后共有多少节木棍。第二行是截断以后,所得到的各节木棍的长度。在最后一组数据之后,是一个零。
Output
为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。
Sample Input
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
Sample Output
6
5
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;bool cmp(int a, int b ){ return a>b;}int sticks[100];bool used[100];int n, StickLen, len;bool dfs(int i,int l,int t)//i为当前试取的棍子序号,l为要拼成一根完整的棍子还需要的长度,t初值为所有棍子总长度{ if(l==0) { t-=len; if(t==0)return true; for(i=0; used[i]; ++i); //剪枝1:搜索下一根大棍子的时候,找到第一个还没有使用的小棍子开始 used[i]=1; //由于排序过,找到的第一根肯定最长,也肯定要使用,所以从下一根开始搜索 if(dfs(i+1,len-sticks[i],t))return true; used[i]=0; t+=len; } else { for(int j=i; j<n; ++j) { if(j>0&&(sticks[j]==sticks[j-1]&&!used[j-1])) //剪枝2:前后两根长度相等时,如果前面那根没被使用, //也就是由前面那根开始搜索不到正确结果,那么再从这根开始也肯定搜索不出正确结果,此剪枝威力较大 continue; if(!used[j]&&l>=sticks[j]) { //剪枝3:最简单的剪枝,要拼成一根大棍子还需要的长度L>=当前小棍子长度,才能选用 l-=sticks[j]; used[j]=1; if(dfs(j,l,t))return true; l+=sticks[j]; used[j]=0; if(sticks[j]==l) //剪枝4:威力巨大的剪枝,程序要运行到此处说明往下的搜索失败, //若本次的小棍长度刚好填满剩下长度,但是后面的搜索失败,则应该返回上一层 break; } } } return false;}int main(){ int i, totalLen; bool flag; while(scanf("%d",&n),n) { totalLen = 0; for(i=0; i<n; ++i) { scanf("%d",&sticks[i]); totalLen += sticks[i]; } sort(sticks, sticks+n, cmp); memset(used, 0, sizeof used ); flag = false; for(StickLen = sticks[0]; StickLen <=totalLen/2; ++StickLen) { len = StickLen; if(totalLen % StickLen == 0) if(dfs(0, StickLen, totalLen) ) { flag= true; printf("%d\n",StickLen); break; } } if(!flag) { printf("%d\n",totalLen); } } return 0;}
0 0
- poj 1011 Sticks ,剪枝神题
- Sticks poj 1011剪枝
- hdu 1455/poj 1011 Sticks(DFS剪枝神题)
- [POJ 1011] Sticks DFS神剪枝
- poj 1011Sticks(DFS +剪枝)
- [深搜+剪枝] POJ - 1011 Sticks
- POJ 1011 Sticks dfs + 剪枝
- POJ 1011 Sticks (backtrakcing+剪枝)
- POJ 1011 Sticks DFS+剪枝
- poj 1011 Sticks -----dfs+剪枝
- POJ 1011 Sticks (DFS + 剪枝)
- POJ 1011 Sticks DFS 剪枝
- POJ 1011 Sticks 深搜+剪枝
- POJ 1011 Sticks 【深搜+剪枝】
- poj 1011 Sticks 【DFS】+【剪枝】
- [POJ 1011]Sticks(DFS剪枝)
- poj 1011 Sticks(搜索+剪枝)
- poj 1011 :Sticks (dfs+剪枝)
- 嵌入式 H.264 BP、EP、MP、HP小结
- Oracle数据库null的注意
- adb connect 连接不上问题的解决
- 双边丝护栏网—铁丝网围栏
- HEVC学习(一) —— HM的使用
- poj 1011 Sticks ,剪枝神题
- SEO优化最优质的发外链平台
- Android系统的体系结构、开发语言及源码结构
- 有监督学习&无监督学习
- linux的uboot启动映像uImage制作过程
- selenium集成sikuli
- 经典算法之6:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 自动完成的QLineEdit(非使用QCompleter版)
- MySQL存储引擎MyISAM与InnoDB的优劣