[POJ-1011] DFS

POJ1011题解(dfs+减枝) POJ1011题解(dfs+减枝,好理解一点) 题意:n根不同长度的小棍,拼成若干长棍,要这些长棍的长度相等,并且小棍刚好用完,问拼成长棍的最短长度是? 思路:首先考虑搜索的方向,最短,那肯定是从最短的情况开始递增,最短的可能情况那肯定就是最长的的单个棍子,所以首先把这些小棍排序,从大到小,并计算这些棍子总和,拼成的长棍的长度从最长的小棍开始搜索,搜索的过程也是判断,用总和除以这个长度得到应该拼成的长棍个数,递归搜索判断小棍之间能否相组合成满足这么多个长度相等的长棍。 在搜索过程中 注意四个地方可以剪枝(效 阅读详情

这道题如果不用剪枝,一定要TLE。这里有两个关键的剪枝,我在代码里有标注。

对于剪枝I, 容易证明。因为如果搜索要继续进行,则存在两个木棒S[j1], S[j2] 且它们的和是S[i], 此时选中S[j1], S[j2],如何S[i]被用在接下来的搜索中并且成功,则我们可以将S[j1], S[j2]合并起来替换S[i],而如果这样,之前的搜索结果应该是TRUE。

对于剪枝II,一句话:新边搜索开始时,第一条边总是会被用到的——也许回会是之后用到。

/*
 * HDU-???? sticks
 * mike-w
 * 2012-9-23
 */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAXN 100

int s[MAXN], tag[MAXN];
int n, sum, each, ns, found; /* ns: n sticks */

int comp(const void *e1, const void *e2)
{
	return *((int*)e2) - *((int*)e1);
}

/*
 * ts: temp sum
 * ei: edge index
 */
int search(int starti, int ts, int ei)
{
	if(ei==ns)
		found=1;
	int i;
	while(tag[starti])
		starti++;
	for(i=starti; i<n && !found; i++)
		if(!tag[i])
		{
			if(i && s[i]==s[i-1] && !tag[i-1])
				continue;
			if(s[i]+ts>each)
				continue;
			if(ts+s[i]<each)
				tag[i]=1,search(i+1, ts+s[i], ei),tag[i]=0;
			else if(ts+s[i]==each)
				tag[i]=1,search(0, 0, ei+1),tag[i]=0;
			if(s[i]+ts==each) 
				break;
			if(ts==0 && starti==i)
				break;
		}
	return 0;
}

int main(void)
{
#ifndef ONLINE_JUDGE
	freopen("in", "r", stdin);
#endif
	int i;
	while(scanf("%d", &n), n)
	{
		memset(s, 0, sizeof(s));
		memset(tag, 0, sizeof(tag));
		found=0;
		for(i=sum=0; i<n; i++)
			scanf("%d", s+i), sum+=s[i];
		qsort(s, n, sizeof(int), comp);
		each=s[0];
		while(!found)
		{
			while(sum%each)
				each++;
			ns=sum/each;
			search(0, 0, 1);
			each++;
		}
		printf("%d\n", each-1);
	}
	return 0;
}


poj1011木棒 dfs 木棒 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 143464   Accepted: 33889 Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初 阅读详情

相关推荐

【OWL部署】Manus又一开源平替OWL真的很好用吗?手把手带你部署并运行你的AI助手OWL(对接Qwen、硅基流动接口)

本文介绍了通用人工智能OWL的部署及国内接口对接,全篇干货满满,手把手教学。

MosuoLc的博客 4042

poj 1011 dfs剪枝

参考了http://blog.youkuaiyun.com/xuezhongfenfei/article/details/8523380 直接贴代码,yuan

kjcsdnblog的专栏 693

第 4 课 树莓派5的换源与中文输入法

树莓派换源、中文输入法的安装

嵌入式老牛的博客 2288

POJ_1011(DFS算法)

POJ_1011,DFS算法,不可用贪心算法,参考博客 #include<iostream> #include<algorithm> using namespace std; struct Stick{ int m_length; //木棒的长度 bool m_used; //木棒是否被使用过 }; Stick g_stick[70]; int g_total, ...

宫·商的博客 781

轴承寿命预测实战:手把手教你用IEEE PHM2012数据集训练模型(附Python代码)

本文详细介绍了如何利用IEEE PHM2012数据集构建轴承剩余寿命预测模型,从数据预处理、特征工程到LSTM模型训练与部署,提供了完整的Python代码实现。通过实战案例,帮助读者掌握预测性维护中的关键技术,提升工业设备的运行安全与效率。

weixin_29186249的博客 311

Python+Seaborn可视化:双因素方差分析结果这样呈现更专业

本文详细介绍了如何利用Python中的Seaborn和statsmodels库,专业地执行并可视化双因素方差分析结果。通过模拟实验数据,演示了从模型构建、统计检验(包括交互作用分析)到诊断验证的全流程。重点展示了如何使用Seaborn绘制交互效应图、组合分布图及热图,将复杂的统计结果转化为直观、富有洞察力的可视化图表,助力科研论文与商业报告的专业呈现。

weixin_29274969的博客 137

【DFS剪枝】poj 1011 Sticks

poj 1011 Sticks 链接:http://poj.org/problem?id=1011 题意: 将未知根数的相同长度的树枝随机截断,给出截断后的树枝,求原树枝最短可能的长度。 思路: 将枚举可能的长度,dfs判断长度的可行性。 剪枝:将树枝从大到小排列,如果长度大的树枝无法组合成(需判断的长度),那么不需继续判断。 在找组合时,如果无法与前一个

学无纸巾 358

Linux音频处理实战:从MP3解码到ALSA播放的完整流程解析

本文详细解析了Linux环境下从MP3文件解码到通过ALSA播放音频的完整实战流程。文章深入剖析了MP3文件结构、PCM原始音频数据格式,并提供了使用ffmpeg/mpg123解码、以及利用ALSA库进行C语言编程播放的实用代码示例,帮助开发者彻底掌握Linux音频处理的核心链路。

weixin_29206669的博客 72

POJ1011 Sticks dfs+剪枝

黑书上面的题目总是这么折磨人。。寒假过去十多天了。整个人都水了。到最后才发现原来这道题目还有中文版的。。。。好神奇。 这道剪枝真的很经典。寒假在家能看看这种题目效果还是很不错的。 这道题目是深搜+各种剪枝。  暴力的dfs铁定超时。   下面给出我程序中所使用的剪枝。 1:如果我现在要拼凑第i根原始木棒,我们指定一根木棒为第一个木棒,如果该木棒与剩下的木棒无论怎么组合都无法拼出原始木棒的

561

【效率手册】Kylin-Desktop-V10-SP1 麒麟系统核心组件实战——从入门到精通的6个关键场景

本文针对Kylin-Desktop-V10-SP1麒麟系统用户,通过文件管理、系统监视、设置优化等6个核心场景实战,深度解析如何高效运用系统内置工具解决文件混乱、性能卡顿、外设驱动等实际问题,帮助用户从功能认知跃升至场景化应用,真正释放国产操作系统的生产力潜能。

weixin_29208327的博客 119

博途AI助手演示,完成简单且重复的梯形图代码,并导入到博途

自写个博途AI助手,下面演示AI帮我生成完善多个模拟量输入转换的代码,

gsjkwg的博客 1525

POJ 1011 (DFS+剪枝)

POJ 1011 题目意思给你n个数,大于50的不算。让你把这n个数分成m组,每组的长度相同为len,使得这个len最短 光用dfs写会超时,剪枝要剪很多方面 1:优化搜索顺序 把木棍从大到小排序,优先尝试长的木棍 2:排除等效冗余   1.当上一个搜索失败了,下一个的数若等于上一个失败的数,那么一定失败   2.如果在当前木棒中尝试拼第一根木棍的递归分支就失败,那么直接判断...

weixin_30436101的博客 239

OpenLayers6入门,快速搭建Vue+OpenLayers地图脚手架项目

本章针对Vue初学者,对Vue不熟悉,甚至还不会Vue的入门学生读者。本章会详细讲解从环境到环境的各个步骤,再到使用脚手架快速生成项目,以及添加地图库依赖,编写简单的高德地图显示页面的。如果已有VUE项目或者熟悉VUE的读者可以不用看本章,直接添加ol依赖到VUE项目中即可。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 5440

poj 1011 Sticks(dfs+剪枝)

poj 1011 Sticks(dfs+剪枝)

PKU_ZZY的博客 1142

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

POJ 1011 Sticks DFS+剪枝

传送门: http://poj.org/problem?id=1011 经典的DFS+ 剪枝 #include #include #include using namespace std; #define F(i,R) for(int i=0;i<R;i++) int a[64+2]; bool used[64+2]; int n; bool cmp(const int &a,con

细语呢喃 974

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

poj 1011Sticks dfs

//poj1011 #include #include #include #include #include #include #include #include #include #include #define PI acos(-1.0) typedef long long LL; const int MAX=0xfffffff; using namespace s

Jinming Su 501

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

POJ 1011 Sticks​ (DFS + 剪枝)

题目地址:http://poj.org/problem?id=1011 题目大意 给出n个小木棒,组合成若干长度最短棍子 解题思路 首先将木棒从大到小排序 dfs(k, l), k是还剩多少木棒没用,l是当前没组装成功的棍子还需多长木棒 剪枝(核心) 选取能被木棒总长度能整除的棍子长度 如果当前选取木棒的长度比所需的长度大,剪枝 如果剩余的木棒总长度还没所需的长度大,剪枝 dfs每一...

橘嘉禾 259

蓝书(算法竞赛进阶指南)刷题记录——POJ1011 Sticks(dfs+剪枝)

题目:POJ1011. 题目大意:给定nnn根木棍长度为aia_iai​,现在要求把它们拼成几根长度相同的木棍(刚好全部用上),使得拼成的木棍单根长度最小. 1≤n≤64,1≤ai≤501\leq n\leq 64,1\leq a_i\leq 501≤n≤64,1≤ai​≤50. 这道题貌似是个NP问题,貌似并不能用多项式算法解决,所以考虑大力dfs. 首先我们可以大力枚举最后的长度,范围是[1,...

hzk_cpp的博客 374

POJ 1011 Sticks(DFS回溯剪枝)

POJ 1011 Sticks(DFS回溯剪枝) http://poj.org/problem?id=1011 题意:给你N根长度可能不同的小棍子,它们是由M根长棍子切断而成的,M未知.现在要你求出原始棍子的最小合法长度是多少? 分析:本题是POJ2362的加强版: http://blog.youkuaiyun.com/u013480600/article/details/27581015

code 1216

Sticks POJ - 1011 少林神棍 dfs四次剪枝

http://poj.org/problem?id=1011 题意:若干根棍子被截成小段的木棒,现在给你这些木棒,问最短可以拼出的棍子长度。 题解:搜索,dfs(r,m) 二个参数分别代表还剩r个木棒,当前棍子还剩m长度。 从dfs(N,L)搜到dfs(0,0)停止。 棍子从大到小排序 从小到大枚举L 四个剪枝 0.考虑木棒大多都一样长的特殊情况。 多余的枚举: ...

Vincent19999999的博客 255

POJ 1011 最小的木棒 (dfs+剪枝|| 搜索好题)

Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。 Input 输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后共有多少节

AK_HuangYC的博客 1727

poj1011 Sticks (DFS)

题目地址 poj1011 题目大意 给n个小木棍,要求你把这些小木棍拼成长度相同木棍,并且长度越小越好 解题思路 首先我们应该确定能够拼成的长度, 下限是n个木棍中最长的长度maxlen,上线就是n个木棍的长度之和sum。 由于题目给的数据并不大,我们可以从maxlen一直遍历到sum,查找到一个符合条件的长度。查找的过程不难看出可以使用深搜来做。 深搜得确定好边界,当n根木棍均用完且凑出来了m个...

qq_43227036的博客 240

POJ 1011 Sticks DFS+很多剪枝 *

题目地址:http://poj.org/problem?id=1011 #include #include #include #include #include #include using namespace std; int sticks[64+5],N,L,nLastStick; bool used[64+5]; bool DFS(int R,int M) { if(R==0&&M==0

BRCOCOLI的博客 239

POJ 1011 - Sticks DFS+剪枝

POJ 1011 - Sticks 题意: 一把等长的木段被随机砍成 n 条小木条 已知他们各自的长度,问原来这些木段可能的最小长度是多少分析: 1. 该长度必能被总长整除 2. 从大到小枚举,因为小长度更灵活, 可拼接可不拼接 3. 因为每一跟木条都要用到, 故若轮到其中一根原始木段选它的第一根木条时,若第一根木条若不满足,则显然第一根木条在接下来任何一根原始木段都...

weixin_33955681的博客 133

POJ 1011 Sticks(DFS + 剪枝)

POJ 1011 Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 160960 Accepted: 38639 Description George took sticks of the same length and cut them randomly until all parts be...

ZQYnn's blog 271
上一篇: tyvj-1027
下一篇: [HDU-2717] BFS
creativewang
博客等级 码龄17年 20粉丝 203原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值