poj-1011 sticks(搜索题)
Input
Output
Sample Input
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
Sample Output
6
5 题意
给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的。对于给定的一组小木棒,请求出原始木棒的最小长度。
题解
dfs搜索,
思想很简单,一个接一个的把木棍拼起来,最后把木棍用光。关键的地方是几个剪枝技巧:设所有木棍的总长度为 Sum, 最终的答案(长度)是 L。
1. 首先要明白, Sum一定要能被 L 整除。
2. L 一定 大于等于 题目给出的最长的木棍的长度 Max。由上述两点,我们想到,可以从 Max 开始递增地枚举 L, 直到成功地拼出 Sum/L 支长度为 L 的木棍。
搜索中的剪枝技巧:
3. 将输入的输入从大到小排序,这么做是因为一支长度为 K 的完整木棍,总比几支短的小木棍拼成的要好。形象一些:如果我要拼 2 支长为8的木棍,第一支木棍我拼成 5 + 3 然后拼第二支木棍但是失败了,而我手中还有长为 2 和 1 的木棍,我可以用 5 + 2 + 1 拼好第一支,再尝试拼第二支,仔细想一想,就会发现这样做没意义,注定要失败的。我们应该留下 2+1 因为 2+1 比 3 更灵活。
4. 相同长度的木棍不要搜索多次, 比如:我手中有一些木棍, 其中有 2 根长为 4 的木棍, 当前搜索状态是 5+4+.... (即表示长度为 5,4,2 的三支拼在一起, ...表示深层的即将搜索的部分), 进行深搜后不成功,故我没必要用另一个 4 在进行 5+4+...5. 将开始搜索一支长为 L 的木棍时,我们总是以当前最长的未被使用的 木棍开始,如果搜索不成功,那么以比它短的开始那么也一定不能取得全局的成功。因为每一支题目给出的木棍都要被用到。如果,有4 5 4 4 3 2想拼成长为 6 的木棍,那么从 5 开始, 但是显然没有能与 5一起拼成 6 的,那么我就没必要去尝试从 4 开始的,因为最终 5 一定会被遗弃。在拼第 2 3 ... 支木棍时,一样。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
using namespace std;
#define PI 3.14159265358979323846264338327950 int len[];
bool vis[];
int sum,l,n; int cmp(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
} bool dfs(int m,int left)
{
if(m== && left==)
return true;
if(left==)
left=l;
for(int i=;i<n;++i)
{
if(!vis[i] && len[i]<=left)
{
if(i>)
{
if(!vis[i-] && len[i]==len[i-])
continue;
}
vis[i]=true;
if(dfs(m-,left-len[i]))
return true;
else
{
vis[i]=false;
if(left==len[i]||left==l) //重要剪枝,不佳这句会超时
return false;
}
}
}
return false;
} int main()
{
while(scanf("%d",&n) && n)
{
sum=;
for(int i=;i<n;i++)
{
scanf("%d",&len[i]);
sum=sum+len[i];
}
qsort(len,n,sizeof(int),cmp);
for(l=len[];l<=sum/;++l)
{
if(sum % l)
continue;
memset(vis,false,sizeof(vis));
if(dfs(n,l))
{
printf("%d\n",l);
break;
} }
if(l>sum/)
printf("%d\n",sum);
}
}
poj-1011 sticks(搜索题)的更多相关文章
- POJ 1011 sticks 搜索
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 125918 Accepted: 29372 Descrip ...
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- POJ 1011 - Sticks DFS+剪枝
POJ 1011 - Sticks 题意: 一把等长的木段被随机砍成 n 条小木条 已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析: 1. 该长度必能被总长整除 ...
- POJ 1011 Sticks(搜索 && 剪枝 && 经典)
题意 : 有n根木棍(n<=64),它们由一些相同长度的木棍切割而来,给定这n根木棍的长度,求使得原来长度可能的最小值. 分析 : 很经典的深搜题目,我们发现答案只可能是所有木棍长度总和的因数, ...
- POJ 1011 Sticks(dfs+剪枝)
http://poj.org/problem?id=1011 题意:若干个相同长度的棍子被剪成若干长度的小棍,求每根棍子原来的可能最小长度. 思路:很经典的搜索题. 我一开始各种超时,这题需要很多剪枝 ...
- OpenJudge 2817:木棒 / Poj 1011 Sticks
1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...
- POJ 1011 Sticks 【DFS 剪枝】
题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...
- poj 1011 Sticks ,剪枝神题
木棒 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 118943 Accepted: 27429 Description 乔治拿 ...
- poj 1011 Sticks (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ...
随机推荐
- JS中比较的数值如何比较大小
<script type="text/javascript"> function check_num(){ var num=document.getElementByI ...
- P4876 近似排列计数50
时间限制:1s 内存限制:256MB [问题描述] 对于一个1-n的排列,如果满足第i个数|ai-i|<=k,则称该排列为K-近似排列. 现在排列的若干位置已经确定,你需要计算剩下的数有多少种排 ...
- Jquery3
动画 动画动画效果一:show(时间),hide(时间)说明:时间的单位为毫秒方法toggle(时间):使用动画切换显示与隐藏动画效果二:slideDown(时间),slideUp(时间)切换:sli ...
- MyBatis配置文件之properties属性
MyBatis提供3个方式使用properties: 1.property子元素. 2.properties文件. 3.程序代码传递. properties属性系给系统配置一些运行参数,一般放在XML ...
- oo第三单元总结
JML梳理 1. JM语法一般结构 public instance //jml中操作数据,并不要求实现 public invariant //不变式 public constraint //约束 no ...
- Unity的stateMachineBehaviour
Unity5新增的StateMachineBehaviour是对状态机的内置,确实方便了很多,这里记录它的两个问题: 1.如果正在执行的状态被打断,当前状态的OnStateExit不会被执行,该问题在 ...
- 读写属性/if判断那点事/数组
读写属性属性操作注意事项 js中不允许出现"-".所以font-size变成fontSize/margin-top变成marginTop. Op.style.with=" ...
- (二)我的JavaScript系列:JavaScript面向对象旅程(下)
剪不断,理还乱,是离愁. 前面已经提到过新语言开发的两个步骤,分别是:一.定义基本的数据类型,完善结构化编程语言的设计:二.为函数类型绑定this的概念,好在对象的方法中可以引用到对象自身.下面是继续 ...
- (一)我的Javascript系列:Javascript的面向对象旅程(上)
今宵酒醒何处,杨柳岸,晓风残月 导引 我的JavaScript系列文章是我自己对JavaScript语言的感悟所撰写的系列文章.现在还没有写完.目前一共出了下面的系列: (三)我的JavaScript ...
- 快速搭建高可用 LNMP Web应用基础架构
云服务器费用:查看费用 产品详情 产品介绍 本镜像是根据Azure Resource Manager模板创建的,基于资源组下的高可用web系统,主要包括前端web负载均 ...