POJ 1011:木棒
传送门
http://poj.org/problem?id=1011
题目大意
已知原来有等长若干木棒,现在给你一堆断了的木棒的长度,问原来的木棒最短是多长
题目类型
DFS + 剪枝 + “贪心优化”
思路
http://blog.csdn.net/lyy289065406/article/details/6647960
三个剪枝
1)设最长的木棒长度max ,木棒长度和sum, 则可能区间为[max, sum/2] 并且 长度能被sum整除
2)一次拼接中,一次循环中,同长度的木棒只检测一次
3)每次拼接的第一个木棒,如果不成功则说明这个木棒一定不能成功。所以break
一个优化
需要逆序搜索。(两个短的比一个长的更有用。)
代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define N 70 //int visnum;
int mu[N];
bool vis[N];
int n; int ncount = ; bool dfs(int goal,int visnum, int len=, int s = n-) { ncount++; //int succeed = 0;
if (visnum == n) {
return true;
}
int last = -;
for (int i = s; i >= ; i--) {
if (vis[i] ||mu[i] == last) continue;
//if (!vis[i] && mu[i] != last && mu[i] + len <= goal) {
//last = mu[i];
vis[i] = true;
//visnum++; if (mu[i] + len < goal) {
if (dfs(goal,visnum+, len+mu[i],i))
return true;
else last = mu[i];
} else if (len + mu[i] == goal) {
if (dfs(goal,visnum+))
return true;
else last = mu[i];
} vis[i] = false;
//visnum--; if (len == ) break;
//}
}
return false;
} int main() {
while (scanf("%d", &n)+ && n) {
int i;
int sum = ;
int max = ;
for (i = ; i < n; i++) {
scanf("%d", &mu[i]);
sum += mu[i];
if (mu[i] > max) max = mu[i];
}
sort(mu, mu+n); //visnum = 0;
//memset(vis,0,sizeof(vis));
//printf("454 = %d\n",dfs(454)); for (i = max; i <= sum/; i++) {
if (sum % i == ) {
//printf("search %d\n", i);
//visnum = 0;
memset(vis, false, sizeof(vis));
if (dfs(i,) == ) break;
//printf("search end\n");
}
}
//printf("sum = %d\n", sum);
if (i >= sum/+) i = sum;
printf("%d\n", i);
//printf("count = %d\n", ncount);
}
return ;
}
POJ 1011:木棒的更多相关文章
- OpenJudge 2817:木棒 / Poj 1011 Sticks
1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...
- 搜索+剪枝——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 【DFS 剪枝】
题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...
- 木棒,POJ(1011)
题目链接:http://poj.org/problem?id=1011 解题报告: #include <cstdio> #include <cstring> #include ...
- Sticks POJ - 1011 少林神棍 dfs四次剪枝
http://poj.org/problem?id=1011 题意:若干根棍子被截成小段的木棒,现在给你这些木棒,问最短可以拼出的棍子长度. 题解:搜索,dfs(r,m) 二个参数分别代表还剩r个木棒 ...
- 【POJ 1011】 Sticks
[题目链接] http://poj.org/problem?id=1011 [算法] 深搜剪枝 首先我们枚举木棍的长度i,那么就有s/i根木棍,其中s为木棍长度的总和,朴素的做法就是对每种长度进行搜索 ...
- poj 1011
http://poj.org/problem?id=1011 这是一道POJ的搜索的题目,最开始确实难以理解,但做过一些搜索的题目后,也没那么难了. 大概题意就是,现在有N根木头,要拼成若干根木头,并 ...
随机推荐
- Linux:FTP服务匿名用户,本地用户,虚拟用户配置
匿名用户 FTP协议占用两个端口号: 21端口:命令控制,用于接收客户端执行的FTP命令. 20端口:数据传输,用于上传.下载文件数据. 实验:匿名访问,服务器192.168.10.10 客户 ...
- MySQL如何复制一个表
MySQL如何复制一个表 1 复制 employee 表 => employee2 () create table employee2 like employee () insert into ...
- Linux 用户管理(一)
一.基础知识介绍 用户 用户组的概念 每个文件和进程,都需要对应一个用户和用户组 linux 系统通过UID和 GID识别用户和组 用户名相当于人名(给人看) UID和GID相当于身份证(系统用的) ...
- python面试题之什么是lambda函数?
lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. lambda所表示的匿名函数的内容应该是很简单的,如果复杂的话,干脆就重新定义一个函数了,使用l ...
- Linux中断体系结构
1.中断处理体系结构 Linux内核将所有中断统一编号,使用一个irq_desc结构数组来描述这些中断. 数组声明在/linux/kernel/irq/handle.c中,其中#define NR_I ...
- Linux扩增卷组、逻辑卷以及缩减逻辑卷
今天我们将了解怎样来扩展卷组,扩展和缩减逻辑卷.在这里,我们可以缩减或者扩展逻辑卷管理(LVM)中的分区,LVM也可称之为弹性卷文件系统. 前置需求使用LVM创建弹性磁盘存储——第一部分 什么时候我们 ...
- 二叉排序树:HUD3999-The order of a Tree(二叉排序树字典序输出)
The order of a Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- kettle-单表增量同步
目标:利于kettle实现单表增量同步,以时间为判断条件 背景:源表:db1.q1 (2w条数据) 目标表:db2.q2(0条数据) 表结构: CREATE TABLE `q1` ( `ID` bi ...
- Report Server multiple value 多值选择
一.项目需求 今天在做项目的时候,有一个需求,具体如下:在Report Server中存在一个报表,报表中有一个参数doctor_name,该参数允许多值,默认全部.但是由于前端页面医生选择时多选没有 ...
- EXCEL宏做数据拆分
用处:将大容量的EXCEL工作簿分解成若干个小的工作簿 Sub aa() For i = 1 To 8 Set nb = Workbooks.Add nb.SaveAs Filename:=ThisW ...