木棒

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;
}

poj 1011 Sticks ,剪枝神题的更多相关文章

  1. DFS(剪枝) POJ 1011 Sticks

    题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...

  2. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

  3. POJ 1011 - Sticks DFS+剪枝

    POJ 1011 - Sticks 题意:    一把等长的木段被随机砍成 n 条小木条    已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析:    1. 该长度必能被总长整除    ...

  4. POJ 1011 Sticks 【DFS 剪枝】

    题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissio ...

  5. OpenJudge 2817:木棒 / Poj 1011 Sticks

    1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...

  6. poj 1011 Sticks (DFS+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 127771   Accepted: 29926 Descrip ...

  7. POJ 1011 Sticks(dfs+剪枝)

    http://poj.org/problem?id=1011 题意:若干个相同长度的棍子被剪成若干长度的小棍,求每根棍子原来的可能最小长度. 思路:很经典的搜索题. 我一开始各种超时,这题需要很多剪枝 ...

  8. POJ 1011 Sticks(搜索 && 剪枝 && 经典)

    题意 : 有n根木棍(n<=64),它们由一些相同长度的木棍切割而来,给定这n根木棍的长度,求使得原来长度可能的最小值. 分析 : 很经典的深搜题目,我们发现答案只可能是所有木棍长度总和的因数, ...

  9. POJ 1011 Sticks dfs,剪枝 难度:2

    http://poj.org/problem?id=1011 要把所给的集合分成几个集合,每个集合相加之和ans相等,且ans最小,因为这个和ans只在[1,64*50]内,所以可以用dfs一试 首先 ...

随机推荐

  1. ASP.NET - 记住滚动条的位置

    MaintainScrollPositionOnPostback ="true" 如果是滚动条在最下面,那么如果刷新页面,滚动条回到最上面. 使用这个属性之后,滚动条会在刷新之前的 ...

  2. Eclipse和PyDev搭建完美Python开发环境(Windows篇)(转)

      摘要:本文讲解了用Eclipse和PyDev搭建Python的开发环境. 十一长假在家闲着没事儿,准备花点时间学习一下Python. 今儿花了一个下午搭建Python的开发环境,不禁感叹————开 ...

  3. Basic4android:多功能的Android应用软件快速开发平台

    Basic4android 是目前最简单.最强大的Android平台快速应用开发工具. ( "Basic4android is the simplest and most powerful ...

  4. Swift - 使用atlas图集实现动画效果(SpriteKit游戏开发)

    我们通常继承SKSpriteNode来实现游戏中的元素,除了可以使用图片作为纹理皮肤外.我们还可以使用动画纹理集来实现动画播放. 动画纹理集的制作也很简单,首先要有一套动画序列图,然后把它们放到一个文 ...

  5. Thinkphp入门 四 —布局、缓存、系统变量 (48)

    原文:Thinkphp入门 四 -布局.缓存.系统变量 (48) [控制器操作方法参数设置] http://网址/index.php/控制器/操作方法 [页面跳转] [变量调节器] Smarty变量调 ...

  6. Fedora Linux 下安装配置C开发环境Code::Blocks

    一.提前的话要说C语言和Linux的关系大家应该都不会陌生,Linux系统内核就是用C语言开发的,所以所有的Linux系统下面 都会有C的编译调试工具,不过这些工具都是命令式的,正式开发的话会很不方便 ...

  7. win7 下使用cygwin

    http://cygwin.com/index.html      还是看官网! 很多用windows的朋友不习惯于用linux的开发环境.虽然很乐意尝试一下,但是往往怕 linux系统打乱了自己的正 ...

  8. CImageList类Create函数参数解析

    前面提到了CImageList类的Create(...)函数,虽然MSDN上已经有所解释,但仍有网友问到参数的具体含义,下面就我的理解,对参数进行一次轻量级的剖析 函数原型(其他重载函数请参看msdn ...

  9. iOS UIButton详细介绍

    昨天,做了项目中的一点,觉得细节还是很重要的.像一个普通的UIButton,给它调试字体格式,大小什么的,确实是蛮耗时间的. 今天打算详细的归纳归纳.. typedef NS_ENUM(NSInteg ...

  10. IT行业,需要经常锻炼,开篇从本钱开始

    今天下完班,和部门兄弟一起去打了两小时乒乓球,大汗淋漓,很痛快. 败给了两个高手,感觉年龄大了些,灵活性没有以前那么好了. 想想以前读书时,在整个学校都叱诧风云,如今即败给了几个老手,唉. 看来以后要 ...