poj1011 Sticks (搜索经典好题)
poj1011 Sticks
题目连接:
Description
George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please help him and design a program which computes the smallest possible original length of those sticks. All lengths expressed in units are integers greater than zero.
Input
The input contains blocks of 2 lines. The first line contains the number of sticks parts after cutting, there are at most 64 sticks. The second line contains the lengths of those parts separated by the space. The last line of the file contains zero.
Output
The output should contains the smallest possible length of original sticks, one per line.
Sample Input
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
Sample Output
6
5
Hint
题意
给定n根木棒,要求将它们拼成若干根等长的木棒,问拼成的木棒最短长度。
题解:
dfs+剪枝。
将木棒从长到短排序,枚举能拼成的长度搜索,枚举范围是最长木棒的长度到所有木棒总长度中能被总长度整除的部分。
搜索:从最长的木棒开始搜,每搜到一根组合好的木棒变换搜索状态,继续从最长的开始搜,直到用完所有木棒。
剪枝:
1.当某根木棒无法完成组合,则无解,直接结束此次搜索,回溯到上一步;
2.当某个长度的木棒不能再此次搜索中使用,则跳过所有该长度木棒的搜索。
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 66;
int n, sum, len, a[maxn];
bool flag, vis[maxn];
int step=0; bool cmp(int a, int b)
{
return a>b;
} bool dfs(int x, int nowlen, int alllen)
{
if(alllen==sum)//已经用完所有木棒,正解
{
return true;
}
if(nowlen==len)//已经拼好一根木棒,继续拼下一根,并从剩下木棒中最长的木棒开始
nowlen=0, x=1;
for(int i=x; i<=n; ++i)
{
if(vis[i] || nowlen+a[i]>len)//木棒已经用过,木棒无法完成组合
continue;
vis[i]=true;
if(dfs(i, nowlen+a[i], alllen+a[i]))//若此次搜索到正确结过则跳出
{
return true;
}
vis[i]=false;
if(nowlen+a[i]==len || nowlen==0)//使用第i根木棒的情况下得不到正解,即第i根木棒无法组合成目标长度,跳出
return false;
while(a[i+1]==a[i]) ++i;//第i根木棒无法使用,则与第i根木棒长度相等的均无法使用
}
return false;
} int main()
{
while(scanf("%d", &n)!=EOF && n!=0)
{
sum=0;
for(int i=1; i<=n; ++i)
{
scanf("%d", &a[i]);
sum+=a[i];
}
sort(a+1, a+n+1, cmp);
for(len=a[1]; len<=sum; ++len)
{
if(sum%len==0)
{
//cout<<len<<"..."<<endl;
memset(vis, false, sizeof(vis));
if(dfs(1, 0, 0))
{
printf("%d\n", len);
break;
}
}
}
}
return 0;
}
poj1011 Sticks (搜索经典好题)的更多相关文章
- 经典算法题每日演练——第十七题 Dijkstra算法
原文:经典算法题每日演练--第十七题 Dijkstra算法 或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如“线性规划”,“动态规划” 这些经典 ...
- [经典算法题]寻找数组中第K大的数的方法总结
[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- hdu 1312:Red and Black(DFS搜索,入门题)
Red and Black Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 经典算法题每日演练——第十六题 Kruskal算法
原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0, ...
- 经典算法题每日演练——第十四题 Prim算法
原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...
- 经典算法题每日演练——第十一题 Bitmap算法
原文:经典算法题每日演练--第十一题 Bitmap算法 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场 ...
- 经典算法题每日演练——第八题 AC自动机
原文:经典算法题每日演练--第八题 AC自动机 上一篇我们说了单模式匹配算法KMP,现在我们有需求了,我要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题. 当然你也可以用KMP算法求出,那 ...
- 经典算法题每日演练——第六题 协同推荐SlopeOne 算法
原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,“商品推荐”,"猜你喜欢“,在实体店中我们有导购来为 ...
随机推荐
- ActiveMQ客户端Apache.NMS从.net 4.0移植到.net standard 2.0
1.从官网或GitHub下载Apache.NMS源码 2.新建.net standard 2.0类库 3.将源码复制到新建的类库中,并删除或注释CommonAssemblyInfo.cs文件(程序集版 ...
- 送命题:讲一讲Mybatis插件的原理及如何实现?
持续原创输出,点击上方蓝字关注我吧 目录 前言 环境配置 什么是插件? 如何自定义插件? 举个栗子 用到哪些注解? 如何注入Mybatis? 测试 插件原理分析 如何生成代理对象? 如何执行? 总结 ...
- Python记录日志模块推荐-loguru!
作者:小张学Python 本文链接: https://mp.weixin.qq.com/s/dkNkEohPl6H2VopUrpxxZg 转载请注明来源!! 前言 在做项目的时候一直在用Pytho ...
- OpenGLshader_uniform
- Vue中computed分析
Vue中computed分析 在Vue中computed是计算属性,其会根据所依赖的数据动态显示新的计算结果,虽然使用{{}}模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的,在模板中放入太 ...
- Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...
- java调用matlab生成exe文件
一.Matlab生成Java Package 1.在MATLAB的Command Window输入deploytool命令,选择Library Compiler. 2.在弹出的窗口选择Java Pac ...
- spring cloud gateway(三、实现限流)
限流一般有两个实现方式,令牌桶和漏桶 金牌桶是初始化令牌(容器)的个数,通过拿走里边的令牌就能通过, 没有令牌不能报错,可以设置向容器中增加令牌的速度和最大个数 漏桶是向里边放入请求,当请求数量达到最 ...
- IP地址的获取
//ip地址的获取:非原创,之前在其他地方看到,拿过来备份下: public static String getIPAddress(HttpServletRequest request) { Stri ...
- SpringBoot-03-JSR303数据校验和多环境切换
3.3 JSR303数据校验 先看如何使用 Springboot中可以用@Validated来校验数据,如果数据异常则统一抛出异常,方便异常中心统一处理. 这里我们写个注解让name只支持Em ...