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

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

题目的大致意思是:

现在有n根木棍,然后需要把它们拼成同样长度的木棍,问满足这个条件的最短的长度是多少?

想法嘛:那肯定是dfs把长度搜一遍就好,但问题的关键是这里会超时。那么就要用到剪枝的原理了。

以下部分是来自于pku的gw老师说哒大笑

1)不要在同一个位置多次尝试相同长度的木棒(在某一次拼接时选择长度为s的木棒导致拼接失败,则在同一位置尝试下一根木棒时,要跳过所有长度为s的木棒)

2)如果由于以后的拼接失败,需要重新调整第i根棍子的拼法,则不会考虑替换第i根棍子中的第一根木棒。

3)不要希望通过仅仅替换已经拼好的棍子的最后一根木棒就能改变失败的局面。

4)拼每一根棍子的时候,应确保已经拼好的部分,长度是从长到短排列的(因为我们应该先拼长的,长的可能性小)

排除方法:每次找一根木棒的时候,只要这不是一根棍子的第一条木棒,那么不应该从下标为0的木棒开始找,而应该从刚刚接上去的那条木棒的下一条开始找(当然,我们要先对木棒进行从大到小的排序)

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
#define maxn 70
int a[maxn],n,L,vis[maxn],lastnum=0;
bool cmp(int a,int b){
	return a>b;
}
//当前还余下的棍子的个数和还缺的长度 
bool dfs(int m,int l){
	if(m==0&&l==0) return true;
	if(l==0)  l=L;
	int s=1;
	//剪枝4 
	if(l!=L){
		s=lastnum+1;
	}
	for(int i=s;i<=n;i++){
		if(!vis[i-1]&&i>1&&a[i]==a[i-1]) continue;	//剪枝1 
		if(!vis[i]&&a[i]<=l){
			vis[i]=1;
			lastnum=i;
			if(dfs(m-1,l-a[i])) return true;
			else{
				vis[i]=0;
				if(L==l||a[i]==l) return false;		//剪枝2,3 
			}
		}
	}
	return false;
}
int main(){
	while(~scanf("%d",&n)){
		if(n==0) break;
		memset(a,0,sizeof(a));
		int sum=0,lmax=-1;
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
			if(a[i]>lmax) lmax=a[i];
			sum+=a[i];
		}
		int i=0;
		sort(a+1,a+1+n,cmp);
		#if 1
		for(i=lmax;i<=sum/2;i++){
			if(sum%i) continue;
			L=i;
			memset(vis,0,sizeof(vis));
			lastnum=0;
			if(dfs(n,i)){
				printf("%d\n",i);
				break;
			}
		}
		if(i>sum/2) printf("%d\n",sum);
		#endif
	}
}
/*
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
*/


POJ1011-Sticks 北大POJ1011-Sticks 解题报告+AC代码 立即下载

相关推荐

通义千问AI模型对接飞书机器人-集成飞书机器人(2-2)

http请求地址上一篇百炼平台配置的应用地址。

hefaji的博客 1916

poj1011

题目有难度。主要难点在于DFS剪枝

小小小小杜 777

深度学习环境搭建:CUDA、Anaconda、PyTorch 完整安装与验证教程

步骤操作验证命令1安装 CUDA 工具包nvcc -V2安装 Anaconda3创建 yolo 环境4安装 PyTorch5验证 GPU。

qq_37606844的博客 321

编程挑战2:三角形问题

三角形 有 n根棍子,棍子 i的长度为 a i 。想要从中选出 3根棍子组成周长尽可能长的三角形。请输 出最大的周长,若无法组成三角形则输出 0。 用5根棍子组成三角形的例子 限制条件   3 ≤ n ≤ 100   1 ≤ a i ≤ 10 6 输入 n = 5 a = {2, 3, 4, 5, 10} 样例 1 输出 12(选择3、4、5时) 方法1如

阳光心态,健康人生的博客 1277

vCenter6.7证书过期导致503报错的全面修复指南:从STS证书更新到SSL信任修复

本文详细解析了VMware vCenter 6.7因STS证书过期导致503服务不可用错误的根本原因,并提供了从诊断、更新STS证书到修复SSL信任链的完整解决方案。通过命令行工具检查证书状态,使用官方脚本更新过期STS证书,并利用lsdoctor工具修复深层SSL信任问题,最终指导用户使用certificate-manager彻底重置所有证书,帮助管理员快速恢复vCenter服务。

pz890123的博客 1294

什么是Claude 的 Agent Skills?

摘要: Claude的Agent Skills功能支持通过结构化技能包(含指令、脚本、工具)实现任务自动化,如数据分析、文档生成等。核心能力包括:1)技能包管理(如Python脚本+模板);2)工具调用(API/数据库交互);3)子代理协作(拆分复杂任务)。快速上手步骤:创建技能包(如Excel报表生成)、配置工具权限、触发执行;支持多代理并行处理(如SQL查询+可视化)。关键技巧:工具需明确定义参数、利用子代理共享上下文、注重权限管控。官方文档与社区资源提供进阶指导,使Claude成为可编程的数字助手。

jobleap.cn求职助手首页 1729

POJ 1011 (经典搜索)

这道题 是 比较经典的 搜索题。 题意: 给出一堆小木棍的长度,需要把它们拼成几根相同的大棍子,求 这些大棍子的最短长度 分析:这道题主要使用,深度搜索+递归,当然这里用到多次剪枝,这对于减小时间复杂度很有效。 #include #include using namespace std; int stick[64]; int used[64]; int len; int n; bool

Jaster_wisdom的专栏 1462

新手避坑指南:在MacBook上为PyTorch正确配置MPS环境,跑通第一个YOLOv8训练

本文详细指导新手如何在MacBook上为PyTorch正确配置MPS环境,并成功运行YOLOv8训练。从环境准备、PyTorch安装到YOLOv8配置和性能调优,提供全面的避坑指南和实用技巧,帮助开发者充分利用Mac的GPU加速能力。

weixin_29100399的博客 229

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

【Flink】状态编程: 订单超时告警

文章目录一、基础概念二、Flink状态编程1、支持的状态类型2、Managed Keyed State六种类型基本API状态的生命周期3、Managed Operator State三、案例:订单延迟告警统计1、需求描述2、需求分析3、数据与模型4、详细实现 一、基础概念 在Flink架构体系中,有状态计算可以说是Flink非常重要的特性之一。 有状态计算是指: 在程序计算过程中,在Flink...

一只皮皮熊 2863

点云配准SIFT+SI+RANSAC+ICP

Spin Image(SI)是一种用于点云数据描述的特征描述子,广泛应用于三维点云配准、识别和重建等领域。它能够捕捉点云中的局部几何信息,具有旋转不变性和部分平移不变性等优点,是一种非常强大的特征描述子。Spin Image是一种强大的点云特征描述子,具有旋转不变性、局部几何信息捕捉等优点,适用于点云配准、目标识别和三维重建等多个领域。通过合理选择局部区域、建立参考框架和计算描述子,可以充分利用Spin Image描述点云的特征,从而实现各种三维场景分析和处理任务。

点云兔子的博客 559

POJ 1011 Sticks 经典的dfs+剪枝

题目点我 非常经典的搜索题目。 题目描述:乔治拿来一组等长的棍子,将它们随机地裁断(截断后的小段称为木棒),使得每一节木棒的长度都不超过50个长度单位。然后他又想把这些木棒恢复到为裁截前的状态,但忘记了棍子的初始长度。 请你设计一个程序,帮助乔治计算棍子的可能最小长度。每一节木棒的长度都用大于零的整数表示。基本思路是从木棒中最长长度max{Li}max\{L_i\}到总长度的一半totalLe

w1d2s的专栏 526

用 SELECT FOR UPDATE 亲手制造典型数据库死锁——从 ABAP 视角揭秘 RDBMS 的锁争夺战

在日常 ABAP 开发中,多数人只在 ST22 里偶尔瞥见这行 dump,却对背后的原理知之甚少。本文借助社区前辈的经典实验,还原一个可复现的死锁现场,进一步讨论产生根因、检测手段与规避策略,并用真实业务案例串联起数据库、Open SQL 与 SAP NetWeaver 锁管理之间的逻辑链条。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 457

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

POJ 1011 Sticks 经典dfs + 剪枝

题意:给n(n 题解:经典dfs+剪枝。总结起来三个剪枝,具体见代码。 Sure原创,转载请注明出处 #include #include #include #include using namespace std; const int maxn = 70; int stick[maxn]; bool vis[maxn]; int sum,n,cur; bool cmp(

Uhh, call me zacky NOW!!! 745

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

poj 1011 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 many stick

呼,是出一口气;吸,是争一口气! 609

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

poj 1011 Sticks(经典深搜dfs+剪枝)

1.枚举所有可能的所组成的长度 2.深搜 两个状态(a,b) a:没有用过的棍的个数 b:当前要组成的棍还需要的长度 初始状态:(n,i) 终止状态:(0,0) 3.剪枝 未剪枝的dfs: bool dfs(int a,int b) {     if(a==0&&b==0)     {         return true;     }     if(b==

Jeromiewn的博客 800

poj 1011 Sticks(经典DFS+剪枝)

题意:给出n根小棒的长度stick[i],已知这n根小棒原本由若干根长度相同的长木棒(原棒)分解而来。求出原棒的最小可能长度。 先说先具体的实现:求出总长度sum和小棒最长的长度max,则原棒可能的长度必在max~sum之间,然后从小到大枚举max~sum之间能被sum整除的长度len,用dfs求出所有的小棒能否拼凑成这个长度,如果可以,第一个len就是答案。 下面就是关键的了,就是这道...

weixin_30673611的博客 107

poj 1011 Sticks(经典搜索问题:DFS+剪枝)

题目:出自http://poj.org/problem?id=1011 转自:http://www.qiyeku.com/xinwen/654439.html 描述:给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的。对于给定的一组小木棒,请求出原始木棒的最小长度。 思路:              1.看到这个题,就是要把小棒一个个进行比较,看能不能恢复若干个原棒。但这样枚

继续微笑lsj 2574

POJ 1011 Sticks (DFS +强力剪枝 (经典))

Sticks

Tc的专栏 985

poj 1011 Sticks 经典的深搜(dfs)+ 强剪枝

Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 131671   Accepted: 30906 Description George took sticks of the same length and cut them randomly until a

qiuxueming_csdn 477

POJ/UVA307 1011 Sticks (DFS +强力剪枝 (经典))

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;page=show_problem&amp;problem=243题意:有n根木棍,要求将所有木条拼接成等长的若干木条,求原始拼接长度的最小值分析:dfs+剪枝题目说拼接总长度不大于50,数组长度要开到100以上吧(因为这个问题,t了我好久) ...

running_acmer的博客 277

搜索+剪枝——POJ 1011 Sticks

搜索+剪枝——POJ 1011 Sticks 博客分类:  算法     非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来,本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0ms过得。仔细想想,对搜索又有了一点点认识。     题目要求将一系列的sticks重新组合,形成若干相等相等长度的木棒,且尽量使木棒长度最小,如果数据量比较小的

在思索中前行! 1127
上一篇: poj(3984)——迷宫问题(输出路径)
下一篇: poj(2184)——Cow Exhibition(01背包变形)
ACMer_hades
博客等级 码龄12年 49粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值