POJ1011 Sticks(dfs)

POJ - 1011 Sticks【DFS】 这道题是一个比较经典的DFS,但是我一开始不会。。。 简单来说,思路是这样的:从小到大遍历所有可能的长度,假设当前遍历到长度为i,那么就要检验这个i是否是满足条件的解,如果是,因为是从小到大遍历,所以是最小的长度,如果不是,则继续遍历。 那么什么才是满足条件的解呢,要求是所有的木棒正好能组合成整数个i长度的木棒。那么怎么判断呢,使用深度优先搜索,对于给定的n个木棒,搜索一种解法能让其组合成整数个i长度的木棒。 其实,这个问题的关键还是看剪枝,主要从三个方面进行剪枝(说实话我做的时候真的怎么都想不到), 阅读详情

Description

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

Input

输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后共有多少节木棍。第二行是截断以后,所得到的各节木棍的长度。在最后一组数据之后,是一个零。

Output

为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。

Sample Input

9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0

Sample Output

6
5



四处剪枝:1.枚举区间是最大的木棒之和-木棒长度之和 2.sum需整除ilen 3.用过的棒子只搜索一次 4.len == 0时棒子无法组合返回上一层


参考:http://blog.youkuaiyun.com/lyy289065406/article/details/6647960


AC代码:


#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int maxn = 70;
int n, stick[maxn];
bool vis[maxn];
bool cmp(int a, int b)
{
	return a > b;
}
bool dfs(int len, int ilen, int s, int num)
{
	if(num == n) return true;
	int tmp = -1;
	for(int i = s; i < n; ++i) {
		if(vis[i] || stick[i] == tmp) continue;
		vis[i] = true;
		if(len + stick[i] < ilen) {
			if(dfs(len + stick[i], ilen, i, num + 1)) return true;
			else tmp = stick[i];
		}
		else if(len + stick[i] == ilen) {
			if(dfs(0, ilen, 0, num + 1)) return true;
			else tmp = stick[i];
		}
		vis[i] = false;
		if(len == 0) break;
	}
	return false;
}
int main(int argc, char const *argv[])
{
	while(scanf("%d", &n) != EOF && n) {
		int sum = 0;
		for(int i = 0; i < n; ++i) {
			scanf("%d", &stick[i]);
			sum += stick[i];
			vis[i] = false;
		}
		sort(stick, stick + n, cmp);
		int len = stick[0];
		bool flag = false;
		for(int ilen = len; ilen <= sum - ilen; ++ilen) 
			if(!(sum % ilen) && dfs(0, ilen, 0, 0)) {
				printf("%d\n", ilen);
				flag = true;
				break;
			}
		if(!flag) printf("%d\n", sum);
	}
	return 0;
}


NOJ史上最全答案 最全答案有所有西北工业大学网上作业答案,可以无限期使用 立即下载

相关推荐

sticks_backtracking

sticks cutting problem sticks are cut randomly until all parts became less than 50 units long. Now to return sticks to the original state. This program is designed to compute the smallest possible original length of those sticks.

NOJ 2030 收购计划 (枚举+DFS 好题)

NOJ 2030 收购计划 (枚举+DFS 好题)

Tc的专栏 1114

无人机蜂群联合指挥作战技术详解

随着人工智能、通信技术、新材料等领域的不断进步,无人机蜂群联合指挥作战技术将迎来更加广阔的发展前景。未来,无人机蜂群将更加智能化、自主化,能够执行更加复杂、精细的作战任务。同时,加强国际合作,共同制定国际规则和标准,将是推动无人机蜂群技术健康发展的重要方向。无人机蜂群技术,是指通过先进的通信技术、自主导航与决策算法,将大量小型、低成本、功能各异的无人机组织成一个高度协同的群体,执行复杂多样的军事任务。2. 通信与数据链:采用高速、低延迟、抗干扰的通信技术,保障群体内无人机间的信息交换。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1546

SCAU 1 西园

1 西园 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: 无限制 描述 华农人多已经不是一天两天的事了,这导致学生吃饭要排很久的队。 现在,传说中的Spring Brother为了让华农学生有个舒服的就餐环境,斥巨资改建华山西园饭堂。 改建后的西园饭堂单单窗口,厨师的数量和级别就有一个巨大的飞跃,学生们吃饭再也不需要排队啦。 由于厨师数目...

Maoxim的博客 455

【49】Camunda8-Self-Managed部署之Docker方式

围绕camunda8 self-managed,介绍了基于Docker部署相关服务的过程。

AlieNeny的博客 1682

【白话系列】倍增算法

【序言】         我认为吧,所有能够优化复杂度的算法都是神奇的,所有能够化繁琐为形象的文字都是伟大的。一直觉得倍增算法是个很神奇的东西,所以决定写点东西纪念一下它。但是作为一个非常不称职的OIER,我非常讨厌在看别人的算法解析时整版的i,j,k等我看到鼠标就惯性移到右上角的符号语言,所以我想用最形象的方式来纪念它。 【一】         从前,有一只可爱得不得了的小白兔,它想从

JarjingX 3万+

16初出茅庐B题

B 身体越来越差的lrc

cb_never_give_up的博客 531

保姆级教程:SAP ABAPer如何为VF01销售发票和MIRO发票校验配置凭证替代(含AC_DOCUMENT BADI完整代码示例)

本文详细解析了SAP ABAP中通过AC_DOCUMENT BADI实现VF01销售发票和MIRO发票校验的凭证替代技术。从技术选型到BADI实施步骤,再到核心逻辑代码示例,为ABAP开发者提供了一套完整的解决方案,帮助应对财务部门复杂的业务需求。

weixin_30421809的博客 351

POJ1011 Sticks dfs+剪枝

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

561

Verilog数字钟

使用Verilog语言进行的数字钟的编写,FPGA开发板亲测正常 大学生一个,第一次自己做的东西,写出来分享在这里插入代码片一下,有不对的地方请大家批评指正。 这次的做的题是:设计一个数字钟,该数字钟能进行正常的时,分计时功能,且能对数字钟的时间进行调整。 该数字钟有3个按键,按键1为功能键,用于数字钟在“正常计时”,“时调整”,“分调整”这三个功能之间切换;按键2,3用于调整时间,仅当数字钟处于...

bin_bin_bun的博客 6149

神经网络学习笔记-波尔兹曼(Boltzmann)机

Boltzmann机是一种反馈随机神经网络 两种输出状态,单极性0或1。输出状态的取值根据概率统计法则决定,这种概率统计法则类似Boltzmann分布,部分反馈 它在神经元状态变化中引入了统计概率,网络的平衡状态服从Boltzmann分布,网络运行机制基于模拟退火算法。 离散Hopfield神经网络+模拟退火+隐单元=Boltzman机 DHNN全反馈,转移函数:符号函数 BM机网络拓扑...

求易学堂的博客 2613

【DFS剪枝】poj 1011 Sticks

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

学无纸巾 358

DeepSeek绝了!3分钟生成PPT,专治“五彩斑斓的黑“!!(保姆教程)

DeepSeek绝了!3分钟生成PPT,专治"五彩斑斓的黑"!!(保姆教程)

yizhen91y的博客 4万+

poj 1011 Sticks(dfs+剪枝)

poj 1011 Sticks(dfs+剪枝)

PKU_ZZY的博客 1142

强化学习赋能宇树机器狗:Isaac Gym与MuJoCo仿真训练全解析

本文详细解析了如何利用Isaac Gym和MuJoCo两大仿真平台为宇树机器狗构建强化学习训练管道。内容涵盖环境配置、模型导入、PPO算法框架设计、奖励函数构建以及从仿真到实机的策略迁移技巧,为开发者提供了一套完整的宇树狗仿真训练实践方案。

zeta9的博客 620

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

poj(1011)——Sticks(经典的dfs+剪枝)

题目的大致意思是: 现在有n根木棍,然后需要把它们拼成同样长度的木棍,问满足这个条件的最短的长度是多少? 想法嘛:那肯定是dfs把长度搜一遍就好,但问题的关键是这里会超时。那么就要用到剪枝的原理了。 以下部分是来自于pku的gw老师说哒 1)不要在同一个位置多次尝试相同长度的木棒(在某一次拼接时选择长度为s的木棒导致拼接失败,则在同一位置尝试下一根木棒时,要跳过所有长度为s的木棒) 2)

ACM_hades的梦想之路 5700

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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 272

POJ 1011 - Sticks DFS+剪枝

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

weixin_33955681的博客 133

dfs+剪枝(poj1011Sticks)

SticksTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 152214 Accepted: 36272DescriptionGeorge took sticks of the same length and cut them randomly until all parts became at most 50 units lon...

luojiushenzi的博客 210

POJ-1011 Sticks + Python(DFS)

题目链接: # https://www.cnblogs.com/dongsheng/archive/2012/08/14/2638926.html 一注意 1.当前题目与前一篇POJ 2362 - Square + Python_xxdragon126的博客-优快云博客 的核心算法一模一样,因此,直接使用的上一篇的核心代码,仅将输入环节做了修改。 2.修改内容包括: 2.1题目给转化为,如何对一组数据进行等分,并要求等分的数量最大,即每一份的长度最小。 ...

xxdragon126的博客 529

poj1011 Sticks DFS深度优先搜索+剪枝

这道题目吧,我看了蛮久的别人的博客,突然发现有一个剪枝,剪完之后从超时变成了0ms,太牛逼了。 我的代码下面都有讲解,自己看看就OK了。

跳动的量子 1283

POJ1011 Sticks

POJ1011 Sticks 时间限制:1 Sec内存限制:128 MB提交:43解决:8[提交] [状态] [讨论版] [命题人:admin] 题目描述 George took sticks of the same length and cut them randomly until all parts became at m...

Albert_Liuzw的博客 329

POJ1011 Sticks DFS

题目链接 http://poj.org/problem?id=1011 分析 关键在于剪枝,最简单的,先选长度较长的分支少;其次是一些避免搜索等效状态空间的剪枝; 对于同一次搜索,尝试的木棍长度递减,因为先选大的再选小的和先选小的再选大的等效; 假如一次尝试失败,那么与该木棍长度相等的就不必再试了; 假如尝试当前木棍作为某根完整木棍的最后一部分,并且失败,就不必再继续尝试其他更小的了,...

Kevin的博客 156

POJ - 1011

传送门 POJ - 1011 题面: Sticks Time Limit: 1000MS Memory Limit: 10000K Description George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to...

RicardoYPeng的博客 270

DFS(剪枝) POJ 1011 Sticks

题目传送门 1 /* 2 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度; 3 DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 4 剪枝主要在4和5:4 相同长度的木棍不再搜索;5 若新的搜索连第一条都没组合出来,直接break; 5 详细解释:http://blog.youkuaiyun.com/l...

weixin_33696822的博客 132
上一篇: POJ2362 Square(dfs)
下一篇: POJ2488 A Knight's Journey(dfs)
GKHack
博客等级 码龄11年 48粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值