2817:木棒 【递归+剪枝】
来源:互联网 发布:电脑usb001端口是哪个 编辑:程序博客网 时间:2024/04/27 11:33
乔治拿来一组等长的木棒,将它们随机地裁断,使得每一节木棍的长度都不超过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
//// main.cpp// 木棒//// Created by JUNJIEGAO on 15/11/6.// Copyright © 2015?? JUNJIEGAO. All rights reserved.//安师大OJ上此题比较坑……北大百炼10ms通过 安师大OJ过不了……//修改后北大百炼0ms通过#include <iostream>#include <cstdio>#include <algorithm>#include <string.h>#include <time.h>using namespace std;int n;int len;int sum;int list[65];int getsite[65];int way[64];int step;int cmp (int a,int b){ return a>b ? 1:0;}int rec (int stick,int overall,int j){ int i; if (overall==sum) return 1; if (stick==len) { stick = 0; j = 0; } for (i=j+1;i<n;i++) { if (getsite[i]==1 || stick+list[i]>len) continue; getsite[i] = 1; way[step] = i; step++; if(rec(stick+list[i],overall+list[i],i)) return 1; step--; getsite[i] = 0; while (list[i+1]==list[i])//关键剪枝:若发现选择第i个木棒不能组合 则跳过与i值相同的木棒 { i++; } if (stick==0 || stick+list[i]==len) break;//剪枝:如果第一次选择木棒就不能组合 则直接跳出本次长度的猜测 如果正好可以拼成猜测的长度 依然组合失败 则判定此次猜测也是错的 直接跳出 } return 0;}int main(int argc, const char * argv[]) { int i; int Max; // clock_t start,end; while (scanf("%d",&n)) { memset(getsite, 0, sizeof(getsite)); sum = 0; Max = 0; step = 0; if (n==0) { return 0; } for (i=0;i<n;i++) { scanf("%d",&list[i]); Max = Max > list[i] ? Max:list[i]; sum+=list[i]; } // start = clock(); sort(list,list+n,cmp); for (len=Max;len<=sum;len++) { if (sum%len!=0) { continue; } if (rec(0, 0, -1)) { cout<<len<<endl; break; } } // end = clock(); // cout<<end-start<<endl; } return 0;}
0 0
- 2817:木棒 【递归+剪枝】
- 木棒拼接 poj1011 搜索+剪枝 递归实现
- poj1011 木棒 dfs+剪枝
- 百炼-2817-木棒-C语言-递归
- Poj Sticks(木棒) DFS+剪枝
- 经典问题:木棒(搜索+强力剪枝)
- poj 1011 回溯+剪枝 木棒问题
- POJ-2817:木棒
- 木棒
- 木棒
- 木棒
- 木棒
- poj 1011 sticks(木棒) (dfs+剪枝)
- POJ 1011 最小的木棒 (dfs+剪枝|| 搜索好题)
- HDU 1455 Sticks(DFS,剪枝,原来木棒的至少长度)
- N皇后递归剪枝实现
- leetcode 87 Scramble String(递归+剪枝)
- 1103. Integer Factorization (30)[递归遍历+剪枝]
- 3.0MongoDB使用的jar包
- 给定入栈序列判断给定出栈序列是否合法
- JLINK驱动刷新之WIN7
- hdoj 5124 lines【】
- java静态代码块、初始化块和构造方法的执行顺序
- 2817:木棒 【递归+剪枝】
- 【Oracle】无宕机迁移更换asm磁盘
- Java String之intern()方法深入分析
- exej4打包jar图文教程
- gradle eclipse web模板项目构建
- 3.0创建mongoDB客户端链接
- 2,XCode的快捷键
- 剑指offer之65 滑动窗口的最大值问题
- Andrid的网络开发技术