poj 1011 Sticks (DFS+剪枝)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 127771 | Accepted: 29926 |
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
Source
题目链接:http://poj.org/problem?id=1011
题目大意:有n根木棍。用它们拼成一些等长的木棍,求拼出的木棍的最短长度。
解题思路:这题的时间限制特别严格。
DFS+剪枝,剪枝较多。首先由多到少枚举木棍数目num。即从n到1,要满足木棍总长度是num的倍数,且拼出的长度要不小于最长的木棍长度,否则无法拼,搜索到答案后退出循环,保证求出的木棍长最短。
剪枝:1.木棍由长到短排序。
2.訪问过的木棍或者加上当前木棍长度后超过了目标长度,则跳过本次循环。
3.若当前木棍和上一根木棍长度同样而且上一根木棍没用到,则跳过本次循环。
4.dfs中标记開始木棍下标。
代码例如以下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[66],vis[66];
int n,num,m;
bool p;
int cmp(int a,int b)
{
return a>b;
}
void dfs(int st,int cur,int cnt)
{
if(p||cnt==num)
{
p=true;
return ;
}
for(int i=st;i<n;i++)
{
if(vis[i]||cur+a[i]>m) //訪问过的木棍或者加上当前木棍长度后超过了目标长度,则跳过本次循环
continue;
if(i-1&&!vis[i-1]&&a[i]==a[i-1]) //若当前木棍和上一根木棍长度同样而且上一根木棍没用到,则跳过本次循环。
continue;
if(a[i]+cur==m)
{
vis[i]=1;
dfs(0,0,cnt+1);
vis[i]=0;
return; //循环里后面的值都在dfs中求过了。这里直接返回上一层
}
if(a[i]+cur<m)
{
vis[i]=1;
dfs(i+1,a[i]+cur,cnt);
vis[i]=0;
if(cur==0) //cur为0时,直接返回上一层
return ;
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
int sum=0;
p=false;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sort(a,a+n,cmp);
for(num=n;num>=1;num--)
{
if(sum%num||a[0]>sum/num)
continue;
m=sum/num;
dfs(0,0,0);
if(p)
break;
}
printf("%d\n",m);
}
return 0;
}
poj 1011 Sticks (DFS+剪枝)的更多相关文章
- POJ 1011 - Sticks DFS+剪枝
POJ 1011 - Sticks 题意: 一把等长的木段被随机砍成 n 条小木条 已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析: 1. 该长度必能被总长整除 ...
- POJ 1011 Sticks dfs,剪枝 难度:2
http://poj.org/problem?id=1011 要把所给的集合分成几个集合,每个集合相加之和ans相等,且ans最小,因为这个和ans只在[1,64*50]内,所以可以用dfs一试 首先 ...
- poj 1011 Sticks ,剪枝神题
木棒 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 118943 Accepted: 27429 Description 乔治拿 ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
- POJ 1011 Sticks 【DFS 剪枝】
题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...
- poj 1011 :Sticks (dfs+剪枝)
题意:给出n根小棒的长度stick[i],已知这n根小棒原本由若干根长度相同的长木棒(原棒)分解而来.求出原棒的最小可能长度. 思路:dfs+剪枝.蛮经典的题目,重点在于dfs剪枝的设计.先说先具体的 ...
- OpenJudge 2817:木棒 / Poj 1011 Sticks
1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...
- uva 215 hdu 1455 uvalive5522 poj 1011 sticks
//这题又折腾了两天 心好累 //poj.hdu数据极弱,找虐请上uvalive 题意:给出n个数,将其分为任意份,每份里的数字和为同一个值.求每份里数字和可能的最小值. 解法:dfs+剪枝 1.按降 ...
随机推荐
- [ES6] Export class and variable
Export variable: export const MAX_USERS = 3; export const MAX_REPLIES = 3; Export default class: exp ...
- ViewDragHelper详解
2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDra ...
- Java基础知识强化61:经典查找之 常见查找算法小结
一.顺序查找 条件:无序或有序队列. 原理:按顺序比较每个元素,直到找到关键字为止. 时间复杂度:O(n) 二.二分查找(折半查找) 条件:有序数组 原理:查找过程从数组的中间元素开始,如果中间元素正 ...
- c - 冒泡/选择排序.
#include <stdio.h> #define LEN 10 #define TRUE 1 #define FALSE 0 /* 对 10 个数进行排序 */ //选择排序法(值得注 ...
- scala学习笔记——特质
一个类扩展自一个或多个特质,以便使用这些特质提供的服务.特质可能会要求使用它的类支持某个特定的特性.不过和java不同,Scala特质可以给出这些特性的缺省实现. 特质的特性: 类可以实现任意数量的特 ...
- 网站压缩数据 GZIP
//1.被压缩数据 String str="Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好H ...
- 【转】【C/C++】内存分配函数:malloc,calloc,realloc,_alloca
转自:http://www.cnblogs.com/particle/archive/2012/09/01/2667034.html#commentform malloc: 原型:extern voi ...
- C/C++中虚函数的调用
代码: #include <iostream> using namespace std; class A{ public: virtual void print(){ cout<&l ...
- java三层模型与三层架构
http://zhidao.baidu.com/question/316273675.html?qbl=relate_question_4 持久层用来固化数据,如常说的DAO层,操作数据库将数据入库业 ...
- dede分页
{dede:list pagesize ='} <div class="intro clearfix"> <ul class="pic"> ...