POJ1011 木棒
来源:互联网 发布:怎样在淘宝网上传宝贝 编辑:程序博客网 时间:2024/05/01 23:15
代码貌似不对,再放放… …
Time Limit: 1000MS Memory Limit: 10000K
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
Source
Central Europe 1995
解释:
看下面程序中的注释即可,
特别的,如果a[i]==rest,a[i]已经失败了,所以和它相同的rest长度肯定也会失败。
如果rest==len说明,说明在用a[i]之前没有用过任何木棍,那么以a[i]为第一根的情况失败了,那么这根木棍肯定拼不成目标长度,这个搜索也就没有意义了,直接跳出大循环。
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int a[55];bool vis[55];int n; bool cmp(const int a,const int b){ if(a>=b) return 1; else return 0;}/*DFS:递归搜索,以剩下小棒数和拼接一根棒所需长度作为递归参数*/ bool dfs(int len,int num,int rest)//..,剩余的小棒数目 { if(num==n && rest==0)/*当还需长度为0且未作接接的小棒个数为0时,说明拼接成功*/ return len; return 1; if(rest==0)/*当完成拼接一个棒时,要重新进行下一根木棒拼接,给remains_len重新赋值*/ rest=len; for(int i=0;i<n;i++) { if(vis[i]) /*已经作为成功拼接的小棒,不再作为拼接对象*/ continue; if(rest>=a[i]) { vis[i]=1; if(dfs(len,num-1,rest-a[i]))/*当接受这根小棒a[i],能完成所有任务,则返回成功拼接棒长*/ return 1; vis[i]=0; if(a[i]==rest && len==rest)//这一步很重要,看上面的分析 break; while(a[i+1]==a[i])/*当a[i]不能完成任务,与它相同的小棒也不能完成任务(剪枝) */ i++; } } return 0;}int main(){ while(scanf("%d",&n) && n) { int sum=0; int len; for(int i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i];//a[1] a[2] a[3] a[4] } sort(a,a+n,cmp); for(len=a[0];len<=sum;len++)/*每次尝试都要置所有小棒为可用*/ { memset(vis,0,sizeof vis); if(sum%len==0) { if(dfs(len,n,0))//要拼成len的长度,用过的木棍数数量,剩余长度 { cout<<len<<endl; break; } } } } return 0;}
0 0
- poj1011木棒
- 【poj1011】木棒
- POJ1011 木棒
- POJ1011 木棒
- POJ1011 木棒
- poj1011 木棒问题
- poj1011之(木棒)
- poj1011 木棒 dfs+剪枝
- poj1011木棒 dfs
- 木棒拼接 poj1011 搜索+剪枝 递归实现
- POJ1011“木棒”终于解出来了
- 木棒
- 木棒
- 木棒
- 木棒
- POJ1011
- POJ1011
- poj1011
- Memcache如何实现分布式存取?
- pojBrackets
- githup提交常用git命令
- git入门
- 23种设计模式 - 单例设计模式
- POJ1011 木棒
- 【树9】二叉树的下一个结点
- Hihocoder #1362 : 修补木桶 (二分)
- ListView与Button冲突
- Android项目上线2
- HDU-1274 Hat’s Words(Trie树)
- Handler.removeMessages的作用
- git,vim,gdb常用的命令小结
- 策略模式