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根木头,要拼成若干根木头,并 ...
随机推荐
- 2018 Python开发者大调查:Python和JavaScript最配?
在2018年秋季,Python软件基金会与JetBrains发起了年度Python开发者调查. 报告的目的是寻找Python领域的新趋势,帮助开发者深入了解2018年Python开发者的现状. 该报告 ...
- python3 连接 mysql和mariadb的模块
是pymysql python2中是MySQL-python sudo pip install pymysql 参考博客https://www.jb51.net/article/140387.htm
- Git for Windows 工具的使用(二)
Git分支 当一个人开发功能A而另一个人开发功能B,之后代码进行整合的时候,使代码既有功能A也有功能B.在Git中,Git给了我们分支的概念. 分支可以使用我们快速的开发协作,并且快速的合并. 分支 ...
- foreach遍历数组的表格
<?php /** * * @authors Your Name (you@example.org) * @date 2017-03-17 19:06:19 * @version $Id$ */ ...
- CodeForces 489F DP Special Matrices
首先统计一下前m行中,有x列1的个数为0,有y列1的个数为1. 设d(i, j)表示有i列1的个数为0,有j列1的个数为1,能到达这个状态的矩阵的个数. 则d(x, y) = 1 每一行都是两个1一起 ...
- Hive学习笔记(四)-- hive的桶表
桶表抽样查询 查看hdfs上对应的文件内容 一个两个桶,第一个桶和第三个桶的数据 task = 4 4 / 2 = 2,一共是两个桶 第1个桶,第1+2个桶
- curl download zip file
https://askubuntu.com/questions/285976/download-zip-file-with-curl-command
- day08 多线程socket 编程,tcp粘包处理
复习下socket 编程的步骤: 服务端: 1 声明socket 实例 server = socket.socket() #括号里不写 默认地址簇使用AF_INET 即 IPv4 ...
- day06 面向对象编程
面向对象: 面向对象: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种品类 只要是对象,就肯定有属性 特性: 多态: 一个统一的接口,多种实现 例如: 一个 ...
- Flash中国地图 开放源码
Flash中国地图,以Object为数据源,便于实现基于中国地图的可视化项目. 特征: swc,便于导入到Flex项目中 数据源为Object,比XML更方便 数据驱动的地图块颜色和Hover颜色 可 ...