poj(1011)——Sticks(经典的dfs+剪枝)
题目的大致意思是:
如今有n根木棍,然后须要把它们拼成相同长度的木棍,问满足这个条件的最短的长度是多少?
想法嘛:那肯定是dfs把长度搜一遍就好,但问题的关键是这里会超时。那么就要用到剪枝的原理了。
下面部分是来自于pku的gw老师说哒
1)不要在同一个位置多次尝试同样长度的木棒(在某一次拼接时选择长度为s的木棒导致拼接失败。则在同一位置尝试下一根木棒时。要跳过全部长度为s的木棒)
2)假设因为以后的拼接失败。须要又一次调整第i根棍子的拼法,则不会考虑替换第i根棍子中的第一根木棒。
3)不要希望通过只替换已经拼好的棍子的最后一根木棒就能改变失败的局面。
4)拼每一根棍子的时候,应确保已经拼好的部分,长度是从长到短排列的(由于我们应该先拼长的,长的可能性小)
排除方法:每次找一根木棒的时候,仅仅要这不是一根棍子的第一条木棒。那么不应该从下标为0的木棒開始找,而应该从刚刚接上去的那条木棒的下一条開始找(当然。我们要先对木棒进行从大到小的排序)
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
#define maxn 70
int a[maxn],n,L,vis[maxn],lastnum=0;
bool cmp(int a,int b){
return a>b;
}
//当前还余下的棍子的个数和还缺的长度
bool dfs(int m,int l){
if(m==0&&l==0) return true;
if(l==0) l=L;
int s=1;
//剪枝4
if(l!=L){
s=lastnum+1;
}
for(int i=s;i<=n;i++){
if(!vis[i-1]&&i>1&&a[i]==a[i-1]) continue; //剪枝1
if(!vis[i]&&a[i]<=l){
vis[i]=1;
lastnum=i;
if(dfs(m-1,l-a[i])) return true;
else{
vis[i]=0;
if(L==l||a[i]==l) return false; //剪枝2,3
}
}
}
return false;
}
int main(){
while(~scanf("%d",&n)){
if(n==0) break;
memset(a,0,sizeof(a));
int sum=0,lmax=-1;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]>lmax) lmax=a[i];
sum+=a[i];
}
int i=0;
sort(a+1,a+1+n,cmp);
#if 1
for(i=lmax;i<=sum/2;i++){
if(sum%i) continue;
L=i;
memset(vis,0,sizeof(vis));
lastnum=0;
if(dfs(n,i)){
printf("%d\n",i);
break;
}
}
if(i>sum/2) printf("%d\n",sum);
#endif
}
}
/*
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
*/
poj(1011)——Sticks(经典的dfs+剪枝)的更多相关文章
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- POJ 1011 - Sticks DFS+剪枝
POJ 1011 - Sticks 题意: 一把等长的木段被随机砍成 n 条小木条 已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析: 1. 该长度必能被总长整除 ...
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
- OpenJudge 2817:木棒 / Poj 1011 Sticks
1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...
- poj 1011 Sticks (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ...
- POJ 1011 Sticks 【DFS 剪枝】
题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...
- POJ 1011 Sticks(搜索 && 剪枝 && 经典)
题意 : 有n根木棍(n<=64),它们由一些相同长度的木棍切割而来,给定这n根木棍的长度,求使得原来长度可能的最小值. 分析 : 很经典的深搜题目,我们发现答案只可能是所有木棍长度总和的因数, ...
- poj 1011 Sticks ,剪枝神题
木棒 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 118943 Accepted: 27429 Description 乔治拿 ...
- uva 215 hdu 1455 uvalive5522 poj 1011 sticks
//这题又折腾了两天 心好累 //poj.hdu数据极弱,找虐请上uvalive 题意:给出n个数,将其分为任意份,每份里的数字和为同一个值.求每份里数字和可能的最小值. 解法:dfs+剪枝 1.按降 ...
随机推荐
- Day13有参装饰器,三元表达式,匿名函数
多个装饰器: 加载顺序:由下而上 执行顺序:由上而下 有参装饰器: 闭包,给函数传参的一种方法 当装饰器内需要参数时,可以采用闭包形式给其传参,第三层函数接收完参数时,就变为无参装饰器 三元表达式: ...
- (转)去除背景色的方法,适合iOS5/6/7/8.0beta
通常使用UISearchbar都需要去除其背景色来与自己的界面风格保持协调,但是UISearchbar的设计随着iOS版本的升级不断地在发生着变化,下面我们通过分析UISearchbar在各个iOS版 ...
- Verilog学习笔记基本语法篇(一)·········数据类型
Verilog中共有19种数据类型. 基本的四种类型: reg型.wire型.integer型.parameter型. 其他类型:large型.medium型.small型.scalared型.tim ...
- 常见slave 延迟原因以及解决方法
一 序言在运维线上M-M 架构的MySQL数据库时,接收的比较多关于主备延时的报警: 点击(此处)折叠或打开 check_ins_slave_lag (err_cnt:1)critical-slav ...
- 解决vm安装centos7网络无法启动问题
采用以下命令: systemctl stop NetworkManager systemctl disable NetworkManager
- PYDay6- 内置函数、验证码、文件操作、发送邮件函数
1.内置函数 1.1Python的内置函数 abs() dict() help() min() setattr() all() dir() hex() next() slice() any() div ...
- cobbler安装配置(二)
安装环境: 操作系统:CentOS 6.5 x86_64测试机器ip:192.168.0.1 关闭防火墙.selinux:service iptables stop && chkcon ...
- Android自制rom,为update.zip签名
确认已经安装好openssl openssl genrsa -out key.pem openssl req -new -key key.pem -out request.pem openssl x5 ...
- ios弹性头部
很久没写博客了,金天有点时间来写下,一直觉得弹性头部很炫,看起来高大上,写起来蛮简单的 层次分析 一共有3层,最底部是图像层,中间是scrollView或者它的子类,最上层是scrollView上面添 ...
- [BZOJ1596] [Usaco2008 Jan]电话网络(树形DP || 贪心)
传送门 1.树形DP #include <cstdio> #include <cstring> #include <iostream> #define N 1000 ...