POJ 1011 Sticks (DFS + 剪枝)
题目地址:http://poj.org/problem?id=1011
题目大意
给出n个小木棒,组合成若干长度最短棍子
解题思路
- 首先将木棒从大到小排序
- dfs(k, l), k是还剩多少木棒没用,l是当前没组装成功的棍子还需多长木棒
- 剪枝(核心)
- 选取能被木棒总长度能整除的棍子长度
- 如果当前选取木棒的长度比所需的长度大,剪枝
- 如果剩余的木棒总长度还没所需的长度大,剪枝
- dfs每一次开始选取木棒,要从上一次选取的后面开始
- 对于相等的木棒,如果一次不成功,就无需再次尝试
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[100], v[100], n, len, cnt;
// 正在拼第stick根原始木棒(已经拼好了stick-1根)
// 第stick根木棒的当前长度为cab
// 拼接到第stick根木棒中的上一根小木棍为last
bool dfs(int stick, int cab, int last) {
// 所有原始木棒已经全部拼好,搜索成功
if (stick > cnt) return true;
// 第stick根木棒已经拼好,去拼下一根
if (cab == len) return dfs(stick + 1, 0, 1);
int fail = 0;
// 小木棍长度递减(从last开始枚举)
for (int i = last; i <= n; i++)
if (!v[i] && cab + a[i] <= len && fail != a[i]) {
v[i] = 1;
if (dfs(stick, cab + a[i], i + 1)) return true;
fail = a[i];
v[i] = 0; // 还原现场
if (cab == 0 || cab + a[i] == len) return false;
}
return false; // 所有分支均尝试过,搜索失败
}
int main() {
while (cin >> n && n) {
int sum = 0, val = 0, m = 0;
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
if (x <= 50) {
a[++m] = x;
sum += a[m];
val = max(val, a[m]);
}
}
n = m;
sort(a + 1, a + n + 1);
reverse(a + 1, a + n + 1);
for (len = val; len <= sum; len++) {
if (sum % len) continue;
cnt = sum / len; // 原始木棒长度为len,共cnt根
memset(v, 0, sizeof(v));
if (dfs(1, 0, 1)) break;
}
cout << len << endl;
}
}
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+剪枝)
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 (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.按降 ...
随机推荐
- 3款高评价的.Net开发的WMS系统推荐
本文简介 WMS仓库管理系统是一款专业的仓库管理系统,旨在帮助企业实现仓储管理的智能化.信息化和自动化.通过该系统,企业可以实现对仓库的进货.出货.库存等各个环节的全面把控,提高仓储管理水平,降低运营 ...
- mySql中使用命令行建表基本操作
一:打开命令行启动mysql服务 注意事项:应该使用管理员身份打开命令行键入命令:net start mysql (鼠标右键使用管理员身份打开),否则会出现拒绝访问报错. 二:登陆数据库 登陆命令为& ...
- Apache Paimon流式湖仓学习交流群成立
Apache Paimon是一个流式数据湖平台.致力于构建一个实时.高效的流式数据湖平台.这个项目采用了先进的流式计算技术,使企业能够实时处理和分析大量数据.Apache Paimon 的核心优势在于 ...
- 分区管理工具 fdisk parted
目录 一.fdisk工具 创建一个磁盘分区 1.虚拟机添加测试硬盘 2.创建磁盘分区 3.文件系统管理磁盘分区 4.挂载 二.parted命令 使用场景 操作命令 'help'查看命令列表 查看分区情 ...
- uni-app全局样式和局部样式
前言 好,经过上个章节的介绍完毕之后,了解了一下 UniApp 的一个全局 页面配置文件,也就是我们的一个 pages.json 文件. 那么了解完了这个文件之后,这片文章,再了解一下 UniApp ...
- 将 .NET Aspire 部署到 Kubernetes 集群
使用Aspirate可以将Aspire程序部署到Kubernetes 集群 工具安装 dotnet tool install -g aspirate --prerelease 注意:Aspirate ...
- dada的GCD ( jxnu acm新生选拔赛)
1007 dada的GCD,输入格式描述有误,已修正 dada的GCD Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/327 ...
- 免费背景音人声分离解决方案MVSEP-MDX23,足以和Spleeter分庭抗礼
在音视频领域,把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题.音波混合的物理特性导致在没有原始工程文件的情况下,将其还原和分离是一件很有难度的事情. 言及背景音人声分离技术,就不能不提Sp ...
- 本地tomcat设置外网访问
将host name中的localhost修改为自己电脑的IP地址,具体的IP地址可以在控制面板的网络和共享中心中进行查看, 打开tomcat的conf文件夹下的server.xml文件,将local ...
- linux安装redis、ununtu和centos等类似的发行版安装redis,完全离线安装reids,自定义版本redis
redis各个版本源码包下载:Index of /releases/ (redis.io) 下载与解压 从Index of /releases/ (redis.io)选择自己需要的版本并下载(此处以r ...