POJ 1011:Sticks 经典搜索
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 128734 | Accepted: 30173 |
Description
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
Output
Sample Input
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
Sample Output
6
5
题意是给你N根木棒,这些木棒是由若干个长度相同的木棒cut来的,原来的木棒长度不知道了,原来有多少根不知道了,需要你去求最小的可能的木棒长度。
这题是POJ2362的加强版,从棒子的最大长度开始搜起,一直到sum。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; int num_s,sum,temp;
int stick[70];
bool visit[70]; bool dfs(int num,int length,int stick_st,int * stick,bool *visit)
{
if(num==(sum/temp))
return true;
int i;
int sample=-1;
for(i=stick_st;i<=num_s;i++)
{
if(visit[i]||stick[i]==sample)continue;//剪枝3,之前不行的木棒,再次碰到相同长度的,直接cut。 visit[i]=true;
if(length+stick[i]<temp)
{
if(dfs(num,length+stick[i],i+1,stick,visit))
{
return true;
}
else
{
sample=stick[i];
}
}
else if(length+stick[i]==temp)
{
if(dfs(num+1,0,1,stick,visit))
{
return true;
}
else
{
sample=stick[i];
}
}
visit[i]=false; if(length==0)//剪枝4,给你最好的条件你都不作为,那么接下来这跟木棒是不可能有任何作为的,cut。
break;
}
return false;
} bool cmp(const int a,const int b)
{
return a>b;
} int main()
{
int i;
while(1)
{
scanf("%d",&num_s);
if(num_s==0)
break; sum=0;
for(i=1;i<=num_s;i++)
{
scanf("%d",&stick[i]);
visit[i]=false;
sum += stick[i];
}
sort(stick+1,stick+1+num_s,cmp); bool flag=false;
for(temp=stick[1];temp<=sum/2;temp++)//剪枝1,最多就实验到sum/2,如果sum/2都不行的话,就说明只能是sum了。因为要把木棍分成几个啊,都大于sum的一半了肯定分不了了啊
{
if(sum%temp==0)//剪枝2
{
if(dfs(1,0,1,stick,visit))//第一个数代表要当前完成第几根木棒
//第二个数代表当前已经完成的长度
//第三个数代表木棒从第几个开始找起的
{
cout<<temp<<endl;
flag=true;
break;
}
}
}
if(!flag)
cout<<sum<<endl;
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 1011:Sticks 经典搜索的更多相关文章
- POJ 1011 Sticks(搜索 && 剪枝 && 经典)
题意 : 有n根木棍(n<=64),它们由一些相同长度的木棍切割而来,给定这n根木棍的长度,求使得原来长度可能的最小值. 分析 : 很经典的深搜题目,我们发现答案只可能是所有木棍长度总和的因数, ...
- 搜索+剪枝——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. 该长度必能被总长整除 ...
- 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 搜索
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 125918 Accepted: 29372 Descrip ...
- poj(1011)——Sticks(经典的dfs+剪枝)
题目的大致意思是: 如今有n根木棍,然后须要把它们拼成相同长度的木棍,问满足这个条件的最短的长度是多少? 想法嘛:那肯定是dfs把长度搜一遍就好,但问题的关键是这里会超时.那么就要用到剪枝的原理了. ...
- poj 1011 Sticks (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ...
随机推荐
- 一个平凡计算机爱好者的linux进步之路
我从小就对计算机特别感兴趣,小的时候梦想就是拥有一台属于自己的电脑.无奈那时候农村条件限制,学校.家庭都不配备电脑.只好悄悄的跑去网吧研究一番,但毕竟时间有限,生活费有限,也不可能经常去网吧玩,在网吧 ...
- Ruoyi的确不错,不知后续能否坚持 允许商用
对于一个开源项目,作者的确很优秀: 在我们现在这个环境,能把一个开源项目做到这个规模,相当不容易:给作者点赞: 不过我也心里嘀咕,不知道后面哪天这个哥们突然发声明,不允许商用呢? 先偷偷留个证据,省的 ...
- eshop5-maven 安装
1. Maven 安装 2.下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.0.5/binaries/ 3. 通过ta ...
- 初学Java(1)
1.Java基本数据类型: 2.Java的main方法: 被static修饰,类名与文件名相同:void:方法的返回值,无返回值:main方法是程序的入口,有且只有一个: String[] args: ...
- S7-300数据处理基本知识(结尾以MW8+1 ADD指令实训仿真,并用状态表监控及刷写变量)
数据处理基本知识汇总 STEP7 的数据类型包括什么? 基本数据类型 复杂数据类型 用于FB(功能块)的输入,输出参数类型 用于FC(功能)的输入,输出参数类型 基本数据类型是什么? 先列举12种数据 ...
- P1042 字符统计
P1042 字符统计 转跳点:
- QT进行多传感器(执行器)的编程框架
物联网的发展使得现今使用越来越广泛,对于多传感器进行管理变得十分有必要.使用传统的过程管理,很明显很容易陷入管理的混乱, 造成信息的不同步.使用面向对象的管理,以及对物理传感器在程序中进行抽象,并且建 ...
- oracle和mysql的一些区别
1.分页查询语句的区别 2.字符串拼接的区别,oracle不支持三个字符串的拼接,mysql支持三个字符串的拼接,在mybatis中,连接的是oracle数据库,字符串的拼接需要如下语句: <s ...
- 九、JavaScript之分号使用,支持一行多语句
一.代码如下 二.执行效果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" cont ...
- 八十、SAP中数据库操作之 (FOR ALL ENTRIES IN )用法,比较难明白
一.代码如下 二.查询结果如下 三.我们把it_spfli的内表内容添加两个 四.结果如下,查询的是所有的JFK和SFO机场. *&------------------------------ ...