题意:给定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. U14.04 teamviewer install

    转载http://www.cnblogs.com/kunyuanjushi/p/5205639.html 安装i386库 sudo apt-get install libc6:i386 libgcc1 ...

  2. 简单的Cooki案例——记录用户上次访问该网页的时间

    功能: 帮助网站实现提示客户端计算机上次访问网站的时间 实现原理: 将每一个会话作为一次访问过程,将每次会话的开始时间作为每次访问网站的时间,然后将这个时间以Cookie的形式存储到客户端的计算机中, ...

  3. [GO]copy的使用

    package main import "fmt" func main() { srcslice := [],} dstslice := [],,,,,} copy(dstslic ...

  4. PLSA的EM推导

    本文作为em算法在图模型中的一个应用,推导plsa的em算法. 1 em算法 em算法是解决一类带有隐变量模型的参数估计问题. 1.1 模型的定义 输入样本为,对应的隐变量为.待估计的模型参数为,目标 ...

  5. 转:[web]javascript 增加表單的input

    利用javascript增加form的input 這是js的部份 //用來區分不同input的name var element_count = 0; function add_element(obj) ...

  6. angular 新建组件

    创建组件 ng g component componentName 第一步:引入其他组件 ngFor指令与数据绑定(数据驱动视图) 父组件穿值到自组建

  7. 死磕Java之聊聊LinkedList源码(基于JDK1.8)

    工作快一年了,近期打算研究一下JDK的源码,也就因此有了死磕java系列 LinkedList 是一个继承于AbstractSequentialList的双向链表,链表不需要capacity的设定,它 ...

  8. mysql 复制(主从复制)

    一.概述 让一台服务器的数据与其他服务器数据保持同步.一台主库的数据可以同步到多台备库上,而备库本身也可以配置成其他服务器的主库. 主要应用: 1) 数据分布 2) 负载均衡 3) 伪备份.在备份基础 ...

  9. Ubuntu 14.10,准备C/C++的编译环境

    Ubuntu缺省情况下,并没有提供C/C++的编译环境,因此还需要手动安装. 如果单独安装gcc以及g++比较麻烦,幸运的是,为了能够编译Ubuntu的内核,Ubuntu提供了一个build-esse ...

  10. 标准模板库使用参考——vector向量容器

    C++的STL从广义上讲分为algorithm(算法),container(容器)和iterator(迭代器)三类,包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法. 在C++标准库中,ST ...