POJ1011 木棒
来源:互联网 发布:月影传说mac版 编辑:程序博客网 时间:2024/05/02 02:36
POJ1011 木棒
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
题解:
整理ing
AC_Code(cpp):
#include<iostream>#include<algorithm>using namespace std;int sticks[110];bool vist[110];int k, m, g;void init(){ memset(sticks, 0, sizeof(sticks));}bool cmp(int x, int y){ return x > y;}bool lol(int sum, int s, int cnt){ if (cnt == g) return true; else if (sum == m) return lol(0, 0, cnt + 1); else { int pre, i; for (pre = 0, i = s; i < k; i++) if (vist[i] && sticks[i] != pre && sticks[i] + sum <= m) { pre = sticks[i]; vist[i] = false; if (lol(sum + sticks[i], i + 1, cnt)) break; vist[i] = true; if (s == 0) return false; } if (i == k) return false; else return true; }}int main(){ while (cin >> k && k != 0) { init(); int max = 0; for (int i = 0; i < k; i++) { cin >> sticks[i]; max += sticks[i]; } sort(sticks, sticks + k, cmp); for (m = sticks[0]; m < max; m++) { if (max%m == 0) { g = max / m; memset(vist, true, sizeof(vist)); if (lol(0,0,0)) break; } } cout << m << endl; }}
0 0
- poj1011木棒
- 【poj1011】木棒
- POJ1011 木棒
- POJ1011 木棒
- POJ1011 木棒
- poj1011 木棒问题
- poj1011之(木棒)
- poj1011 木棒 dfs+剪枝
- poj1011木棒 dfs
- 木棒拼接 poj1011 搜索+剪枝 递归实现
- POJ1011“木棒”终于解出来了
- 木棒
- 木棒
- 木棒
- 木棒
- POJ1011
- POJ1011
- poj1011
- 表单常用原生js
- C#_LINQ数据查询
- Windows下U盘安装Ubuntu双系统
- Android动画(2)视图动画
- PHP批量导入excel数据到数据库简易版方法(From Jeskitt)
- POJ1011 木棒
- Windows10+Caffe+CUDA7.5+VS2013环境配置
- 关于 Storm 的一篇好文章
- 位操作练习
- 第三章 操作符
- 一起talk C栗子吧(第八十回:C语言实例--进程互斥)
- CC学习C语言 小结No.1
- 合并两个有序的单链表
- 心上莲花:我的一些经历