题意:给定n条拆掉的棍子,问能凑成最短的多条相同长度棍子的最短长度

x:当前第几条正在合成的棍子

y:目前正在尝试的拆掉的棍子

z:当前长度

剪枝方案:

1.按照长度单调性排序,减少重复搜索

2.如果当前拼接棍子失败,那接下来相同长度也会失败

3.第一条棍子就失败就不必搜索了

/*H E A D*/
int a[666],tot,ans,sum,n;
bool used[666];
bool dfs(int x,int y,int z){
if(x==tot+1) return 1;
if(z==sum/tot) return dfs(x+1,1,0);
if(y==n+1) return 0;
int failed=0;//!!!
rep(i,y,n){
if(!used[i]&&z+a[i]<=sum/tot&&failed!=a[i]){
used[i]=1;
if(dfs(x,y+1,z+a[i])) return 1;
failed=a[i];
used[i]=0;
if(z==0)return 0;//!!!
}
}
return 0;
}
int main(){
while(~iin(n)){
if(n==0)break;
rep(i,1,n) a[i]=read();
sort(a+1,a+1+n,greater<int>());
sum=0;
rep(i,1,n) sum+=a[i];
ll ans=oo;
rrep(i,sum,1){
if(sum%i==0){
tot=i;
memset(used,0,sizeof used);
if(dfs(1,1,0)){
ans=min(ans,(ll)sum/tot);
break;
}
}
}
println(ans);
}
return 0;
}
int main(){
while(~iin(n)){
if(n==0)break;
rep(i,1,n) a[i]=read();
sort(a+1,a+1+n,greater<int>());
sum=0;
rep(i,1,n) sum+=a[i];
ll ans=oo;
rrep(i,sum,1){
if(sum%i==0){
tot=i;
flag=0;
memset(used,0,sizeof used);
if(dfs(1,1,0)){
ans=min(ans,(ll)sum/tot);
break;
}
}
}
println(ans);
}
return 0;
}

POJ - 1011 剪枝练习的更多相关文章

  1. DFS(剪枝) POJ 1011 Sticks

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

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

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

  3. POJ 1011 Sticks 【DFS 剪枝】

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

  4. POJ 1011 - Sticks DFS+剪枝

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

  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. Sticks POJ - 1011 少林神棍 dfs四次剪枝

    http://poj.org/problem?id=1011 题意:若干根棍子被截成小段的木棒,现在给你这些木棒,问最短可以拼出的棍子长度. 题解:搜索,dfs(r,m) 二个参数分别代表还剩r个木棒 ...

  8. POJ 1011 Sticks(dfs+剪枝)

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

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

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

随机推荐

  1. 10. Regular Expression Matching字符串.*匹配

    [抄题]: Given an input string (s) and a pattern (p), implement regular expression matching with suppor ...

  2. pip镜像源配置

    #配置文件路径:%HOME%\pip\pip.ini,不存在新建即可 #在 Windows 2000 以上版本里,%HOME% 目录指的是系统盘下的“\Documents and Settings\你 ...

  3. hdu4643 GSM

    #include<stdio.h> #include<math.h> #define Max 55 #define eps 1e-8 int n,m; struct Point ...

  4. GC: CMS垃圾回收器三(实践)

    jstat -gc -t [pid] 1000 监控日志... ,抽取其中关键记录不一定连续 应用启动时间 2015-06-23 10:22:27 ,换算后,第二条记录时间是2015-06-24 22 ...

  5. 关于Java异常一段很有意思的代码

    今天学习了Java的异常,讲到try-catch-finally时,老师演示了一段代码,觉得很有意思,很能反映出其执行的过程,让自己有点绕,特意记录一下. 只要代码执行到try代码内部, 不管有没有异 ...

  6. Hacker News排名算法工作原理

    这篇文章我要向大家介绍Hacker News网站的文章排名算法工作原理,以及如何在自己的应用里使用这种算法,这个算法非常简单,但却在突出热门文章和遴选新文章上表现的非常优秀.本质上,这段Hacker ...

  7. delphi 取json中数组的值(ISuperArray)

    { "action": "******", "data": [ { "Info1": { "ID": ...

  8. MySQL联合索引运用-最左匹配原则

    前言 之前看了很多关于MySQL索引的文章也看了<高性能MySQL>这本书,自以为熟悉了MySQL索引使用原理,入职面试时和面试官交流,发现对复合索引的使用有些理解偏颇,发现自己的不足整理 ...

  9. GCC 显示所有的warning option

    此事需求的来源是有要求调查,gcc中的那些warning是有问题的,代码必须要修改,那些事需要确认的,就要显示所有的warning选项是什么 查了下,方法如下 显示所有的warning和warning ...

  10. c#后台弹出框

    ClientScript.RegisterStartupScript(this.GetType(), "message", "<script>alert('提 ...