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代码 立即下载

相关推荐

血管分割中的直径平衡难题:从clDice到cbDice的演进与实践

本文探讨了血管分割中的直径平衡难题,详细分析了从clDice到cbDice的技术演进与实践。通过引入半径感知权重和边界对齐惩罚,cbDice在保持拓扑完整性的同时提升了几何敏感度,显著改善了细小血管的分割效果。文章还分享了在nnU-Net中实现cbDice的工程细节,包括GPU加速骨架提取和多任务损失组合策略,为医学影像分析提供了重要参考。

weixin_29170327的博客 243

poj1011

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

小小小小杜 777

中兴畅行60 ZTE 7552N 深度改造指南:从解锁BL到Magisk Root与IMEI硬改全流程

本文详细介绍了中兴畅行60(ZTE 7552N)的深度改造全流程,包括解锁BL、刷入Magisk获取Root权限以及IMEI硬改等关键步骤。通过专业的操作指南和实用技巧,帮助用户安全完成设备改造,同时提醒注意法律风险和技术难点。

weixin_33670786的博客 1899

编程挑战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

Web端百度离线地图3.0实战:从零搭建到私有化部署

本文详细介绍了Web端百度离线地图3.0的完整实战流程,从核心SDK本地化、功能模块下载到地图瓦片部署。通过逐步修改代码与配置,实现在无外网环境下的私有化部署,解决了内网或网络不稳定场景下的地图应用需求,并提供了关键的避坑指南。

n7o8p的博客 714

Windows下Colmap编译安装全攻略:从Boost到CUDA的避坑指南

本文详细介绍了在Windows系统下编译安装Colmap三维重建工具的完整流程与实战经验。针对Boost库版本兼容性、CUDA与Visual Studio的版本匹配等常见难题提供了具体的避坑指南和解决方案,帮助开发者高效完成从环境配置到最终部署的全过程。

weixin_28235513的博客 199

POJ 1011 (经典搜索)

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

Jaster_wisdom的专栏 1462

uniapp - 使用 <video> 播放视频黑屏,浏览器控制台报错: DOMException: The element has on supported sources.(详细完美解决方案)

uniapp video 视频播放黑屏,uniapp 报错DOMException: The element has on supported sources.,uniapp如何解决DOMException: The element has on supported sources.,uniapp使用video标签无法播放视频出现黑屏问题处理,uniapp解决video视频黑屏显示0秒,并且浏览器报错DOMException: The element has on supported sources.,un

✅ 精选推荐文章 7056

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

【文献阅读】使用深度语音后验改进独立于说话者的构音障碍可懂度分类

原文名称:本文探讨了利用DeepSpeech后验概率改进说话人无关的构音障碍可理解性分类方法。作者提出了一个基于DeepSpeech(一种端到端的语音转文本引擎)输出的新特征集,用于评估构音障碍患者的语音可理解性。这些新特征在说话人无关的情况下表现良好,能够更好地处理不同说话人的变异性。背景介绍:数据集:特征提取:实验设置:结果:本文提出的新特征集在说话人无关的构音障碍可理解性分类任务中表现出色,特别是在低可理解性和高可理解性类别上。未来的工作将集中在减少低可理解性和中可理解性类别之间的混淆,以进一步提高系

帅小柏的博客 452

Ardupilot飞控姿态角与姿态角速度控制过程分析(超长篇)

目录 目录 摘要 1.代码控制过程分析 摘要 本节主要记录自己学习ardupilot飞控代码的姿态角速度的控制过程 1.代码控制过程分析 可以看出:AC_AttitudeControl *attitude_control; //指针对象 virtual void rate_controller_run() = 0;是AC_AttitudeContro...

陌城烟雨 1万+

POJ 1011 Sticks 经典的dfs+剪枝

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

w1d2s的专栏 526

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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、付费专栏及课程。

余额充值