poj1011-Sticks dfs各种剪枝

DFS + 剪枝策略 一:简介 (1)相信做过ACM的人,都很熟悉图和树的深度优先搜索;算法里面有蛮力法 —— 就是暴力搜索(不加任何剪枝的搜索); (2)蛮力搜搜需要优化时,就是需要不停的剪枝,提前减少不必要的搜索路径,提前发现判断的过滤条件; (3)剪枝的核心问题就是设计剪枝判断方法,哪些搜索路径应当舍弃,哪些搜索路径不能舍弃(保留); (4)高效的剪枝过滤条件需要从局部和全局来考虑问题,发现内在的规律。 阅读详情

Sticks
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 133058 Accepted: 31236

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 return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please help him and design a program which computes the smallest possible original length of those sticks. All lengths expressed in units are integers greater than zero.

Input

The input contains blocks of 2 lines. The first line contains the number of sticks parts after cutting, there are at most 64 sticks. The second line contains the lengths of those parts separated by the space. The last line of the file contains zero.

Output

The output should contains the smallest possible length of original sticks, one per line.

Sample Input

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

Sample Output

6
5


思路还可以,就是剪枝。。。。剪枝。。。。剪枝,咋想的啊。。。想破脑子也就想出来两个剪枝的地方,一直超时,大神一剪剪5个地方,一个

if (len == 0) break;,跪了。。。


思路:先从大到小排序,因为大的组合方式相对较少,先考虑(剪枝1)


InLen一定大于或者等于maxn,(否则你要组成的一条棍子还没有原来的长,不可能),并且要小于等于sum的一半,否则最后组成比如

17, 15这样的情况不用dfs,直接pass (剪枝2)

sum必须要能够整除InLen(剪枝3)

差不多了没啥事咱开始dfs吧

用一个sample来记录跳过当前层不能用的连续的棒子(剪枝4)

当一个InLen长的棒子合成之后开始合成新的InLen长的棒子时,若新的第一块碎片递归下去不能成功(也就是下面所有的的递归都返回false,因为包含这个碎片的所有的情况在返回的时候都考察过了,说明以上一根合成的结果为起点走下去不行,上一根棍子合成的有问题),则直接返回,否则继续走的话也不会成功,因为到最后,这第一块碎片迟早要面对的,在后面面对的时候跟第一次面对的时候没什么区别,第一次面对的时候不行,后面再面对的时候还是不行,因为第一次面对的时候已经把所有包含这第一块碎片的情况都考察进去了(剪枝5)


最后一种剪枝感觉不太好理解


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

int s[100];
bool vis[100];

bool cmp(int a, int b) {
	return a > b;
}

int N;

bool dfs(int len, int InLen, int num, int pos) {
	if (num == N) return true;
	for (int i = pos, sample = -1; i < N; i++) {
		if (!vis[i] && sample != s[i]) {
			vis[i] = true;
			if (len + s[i] < InLen) {
				if (dfs(len + s[i], InLen, num + 1, i)) {
					return true;
				} else {
					sample = s[i];
				}
			} else if (len + s[i] == InLen) {
				if (dfs(0, InLen, num + 1, 0)) {
					return true;
				} else {
					sample = s[i];
				}
			}
			vis[i] = false;
			if (len == 0) 
				break;
		}
	}
	return false;
}

int main()
{
	int sum, maxn;
	bool flag;
	while (~scanf("%d", &N) && N) {
		memset(vis, false, sizeof(vis));
		sum = 0;
		for (int i = 0; i < N; i++) {
			scanf("%d", &s[i]);
			sum += s[i];
		}
		sort(s, s + N, cmp); //降序排序 
		
		maxn = s[0];  //取最大的 
		flag = false;
		
		//maxn <= InLen <= sum / 2
		for (int InLen = maxn; InLen + InLen <= sum; InLen++) {
			if (!(sum % InLen) && dfs(0, InLen, 0, 0)) {
				flag = true;
				printf("%d\n", InLen);
				break;
			}
		}
		if (!flag) {
			printf("%d\n", sum);
		}
	}
	return 0;
}


POJ1011-Sticks-经典搜索题详解优化 Sticks http://poj.org/problem?id=1011 解题思路 1.一开始的思路是遍历木棒能组成的所有长度,然后进行许多判断;发现判断过程很复杂,做不了,就换了个思路; 2.遍历所有可能的木棒长度len,并得到木棒的个数cnt; len满足 sum%len==0; cnt=sum/len; 3.得出DFS的终止条件: 拼接成功的木棒 > cnt 或者 无法继续拼接 4 .然后就是这题的精华:各种剪枝与优化 1.木棍应从长到小遍历; 2.限制拼接一根木棒的木棍长度是递减的,因 阅读详情

相关推荐

别再乱改基础库了!手把手教你搞定uni-app小程序上传图片报错(chooseAndUploadFile权限篇)

本文详细解析了uni-app开发微信小程序时遇到的`chooseAndUploadFile`权限报错问题,并提供了四步解决方案。从隐私协议与API权限的关联入手,指导开发者正确配置后台声明、双重提交策略和版本管理,避免降级基础库等常见误区,确保小程序合规运行。

weixin_33709364的博客 276

307 Sticks(*****)经典DFS+剪枝

/* 推荐题型:五星 经典DFS + 剪枝 题意:长度相同的木棒被分成许多段,求木棒原来状态的最短长度 此题重在剪枝,主要剪枝思路有: 使用数组a存储被分解成的各个部分的长度,木棒的每段被称之为s ①搜索范围从max到sum,且必须能被sum整除 ②为避免重复,组合成木棒的s从大到小排序,每根木棒的第一个s,也要求从大到小排序 ③在某层搜索中,如果a[i]没有使用,且a[i]==a[i+1],则...

java开发指南博客 【转载】 129

数字锁相环的原理与FPGA实现

数字锁相环是锁相环电路的全数字实现。锁相环电路能够实现对输入信号的相位进行跟踪,进而在噪声中提取纯净的有用信号。以上就是今天要讲的内容,本文简单地介绍了锁相环的原理,然后,在Vivado仿真平台上,通过verilog做仿真验证。最终仿真结果能够实现锁定,但锁定时间较长,表明参数仍可做调整。

weixin_45857378的博客 8506

DFS:拯救少林神棍(Sticks)[四轮剪枝操作]

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

快乐修勾的博客 2682

山东大学软件测试实验2——系统功能测试

​ 给出一个被测试的 Web 应用系统(SUT)。http://211.87.232.162:8080/注:友情链接不用延伸测试。针对被测试的 Web 应用系统进行功能测试,发现其存在的缺陷。 ​

m0_74033391的博客 2408

基于simulink的变压器保护仿真设计【MATLAB源码+Word文档】

电力系统变压器保护MATLAB/simulink仿真设计。纵联差动保护-过电流保护-距离保护

weixin_761237174的博客 1270

Sticks<DFS>

题意: 给n个木棍,这些木棍是由m个长度均为L的木棍切割而来,求L的最小值。 思路: DFS+剪枝。 剪枝: 1:L的取值范围在n(max)和n(sum)之间,逐个枚举。sum%L!=0则L不能用。 2:sort对n个木棍长度进行由小到大排序,有以下好处: a:从大的开始搜索。eg:如果L8;5+3>(优势)5+2+1;把更灵活地木棍留...

weixin_30287169的博客 235

量化交易新手入门:从零开始搭建你的第一个Python交易策略(附完整代码)

本文为量化交易新手提供从零开始搭建Python双均线策略的完整指南,涵盖环境配置、数据获取、策略实现及风险管理等关键步骤。通过详细的代码示例和实践建议,帮助读者快速掌握量化交易的核心技术,并避免常见陷阱。文章特别强调Python在量化交易中的技术革新优势,适合希望进入金融科技领域的初学者。

weixin_26905487的博客 443

Sticks DFS+剪枝

George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had orig...

博客标题不能为空我也没办法 268

告别乱码!ESP32+LVGL显示中文的保姆级教程(基于ESP-IDF,附7000字库生成)

本文详细介绍了如何在ESP32上使用LVGL显示中文的完整解决方案,包括中文字库生成、ESP-IDF工程集成和优化技巧。通过7000字库生成和实战案例,帮助开发者彻底解决中文乱码问题,适用于智能家居、智能手表等嵌入式设备开发。

weixin_28740299的博客 396

GEE:提取研究区 NDVI/LST/RVI 并进行时间序列线性插值填补缺失像素和Savitsky-Golay(SG)滤波平滑处理

养乐多_本文将介绍使用Landsat数据集,构建时间序列,并使用线性插值算法填补缺失数据,或者去云空洞,并进一步对完整的时间序列数据进行SG滤波处理。

养乐多的博客 3195

POJ1011 Sticks dfs+剪枝

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

561

【Docker安装】OpenEuler系统下部署Docker环境

【Docker安装】OpenEuler系统下部署Docker环境

jks212454的博客 4188

【DFS剪枝】poj 1011 Sticks

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

学无纸巾 358

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

poj 1011 Sticks(dfs+剪枝)

poj 1011 Sticks(dfs+剪枝)

PKU_ZZY的博客 1142

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

ACM_hades的梦想之路 5700

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

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

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

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

跳动的量子 1283

POJ1011 Sticks【DFS+剪枝】

题目: 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 return sticks to the original state, but he forgot how m

淡然坊 3988

DFS(剪枝) POJ 1011 Sticks

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

weixin_33696822的博客 132

hdu1455 && poj1011 Sticks(深度优先搜索 DFS 经典剪枝 详解)

这道题在两个OJ上都有 POJ地址 http://poj.org/problem?id=1011 HDU地址 http://acm.hdu.edu.cn/showproblem.php?pid=1455 Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12929

ACMan 637

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

POJ 1011 Sticks​ (DFS + 剪枝)

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

橘嘉禾 259
上一篇: poj2362 Square DFS剪枝
下一篇: poj3235 Fence Repair 优先队列 哈弗曼树
Daemoonn
博客等级 码龄11年 42粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值