Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >poj 1011 Sticks (DFS+剪枝)

poj 1011 Sticks (DFS+剪枝)

作者头像
全栈程序员站长
发布于 2022-07-10 02:02:32
发布于 2022-07-10 02:02:32
22600
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是全栈君。

Sticks

Time Limit: 1000MS

Memory Limit: 10000K

Total Submissions: 127771

Accepted: 29926

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0

Sample Output

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
6
5

Source

Central Europe 1995

题目链接:http://poj.org/problem?id=1011

题目大意:有n根木棍。用它们拼成一些等长的木棍,求拼出的木棍的最短长度。

解题思路:这题的时间限制特别严格。

DFS+剪枝,剪枝较多。首先由多到少枚举木棍数目num。即从n到1,要满足木棍总长度是num的倍数,且拼出的长度要不小于最长的木棍长度,否则无法拼,搜索到答案后退出循环,保证求出的木棍长最短。

剪枝:1.木棍由长到短排序。

2.訪问过的木棍或者加上当前木棍长度后超过了目标长度,则跳过本次循环。

3.若当前木棍和上一根木棍长度同样而且上一根木棍没用到,则跳过本次循环。

4.dfs中标记開始木棍下标。

代码例如以下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[66],vis[66];
int n,num,m;
bool p;
int cmp(int a,int b)
{
	return a>b;
}
void dfs(int st,int cur,int cnt)
{
	if(p||cnt==num)
	{
		p=true;
		return ;
	}
	for(int i=st;i<n;i++)
	{
		if(vis[i]||cur+a[i]>m)    //訪问过的木棍或者加上当前木棍长度后超过了目标长度,则跳过本次循环
			continue;
		if(i-1&&!vis[i-1]&&a[i]==a[i-1])    //若当前木棍和上一根木棍长度同样而且上一根木棍没用到,则跳过本次循环。
			continue;
		if(a[i]+cur==m)
		{
			vis[i]=1;
			dfs(0,0,cnt+1);
			vis[i]=0;
			return;				//循环里后面的值都在dfs中求过了。这里直接返回上一层
		}
		if(a[i]+cur<m)
		{
			vis[i]=1;
			dfs(i+1,a[i]+cur,cnt);
			vis[i]=0;
			if(cur==0)           //cur为0时,直接返回上一层
				return ;
		}
	}
}
int main()
{
	while(scanf("%d",&n)!=EOF&&n)
	{
		int sum=0;
		p=false;
		memset(vis,0,sizeof(vis));
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
			sum+=a[i];
		}
		sort(a,a+n,cmp);
		for(num=n;num>=1;num--)
		{
			if(sum%num||a[0]>sum/num)
				continue;
			m=sum/num;
			dfs(0,0,0);
			if(p)
				break;
		}
		printf("%d\n",m);
	}
	return 0;
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115729.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月3,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
挑战程序竞赛系列(31):4.5剪枝
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/76550373
用户1147447
2019/05/26
4500
试题 算法训练 小木棍
资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述   RJ有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 50。现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。   给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。 输入格式   第一行为一个单独的整数 N 表示看过以后的小木柜的总数,其中 N<=60;
GeekLiHua
2025/01/21
590
ZOJ 3661 Palindromic Substring(回文树)
Palindromic Substring ---- Time Limit: 10 Seconds      Memory Limit: 65536 KB ---- In the kingdom of string, people like palindromic strings very much. They like only palindromic strings and dislike all other strings. There is a unified formula to calculat
ShenduCC
2018/04/26
4740
Sticks(UVA - 307)【DFS+剪枝】
1.这道题题意就是说原本有一些等长的木棍,后来把它们切割,切割成一个个最长为50单位长度的小木棍,现在想让你把它们组合成一个个等长的大木棍,要求这个拼接成的大木棍的长度最小。问最小长度是多少。(注意,在接下来的介绍中,将最后的大木棍表述为拼接木棍,小木棍还是叫小木棍)
_DIY
2020/10/19
5020
poj 1011 hdoj 1455 Sticks(搜索+剪枝)
令initlen为所求的最短原始棒长,maxlen为给定的棒子堆中最长的棒子,sumlen为这堆棒子的长度之和,那么initlen必定在范围[maxlen,sumlen]中,
xindoo
2021/01/22
2450
【题解】小木棍(搜索剪枝)
现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。
fishhh
2022/08/30
4110
【题解】小木棍(搜索剪枝)
HDOJ1518Square 深搜
Square Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11099 Accepted Submission(s): 3566
谙忆
2021/01/19
2600
《算法竞赛进阶指南》0x23 剪枝
比如一个非最优的问题边界,在搜索到最后一层才识别出来舍掉,和搜索到中途就识别出来舍掉,这就是优化搜索顺序的好处
一只野生彩色铅笔
2022/10/31
4870
《算法竞赛进阶指南》0x23 剪枝
POJ 1011 Sticks
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/118378.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/13
1690
poj 2362 hdoj 1518 Square(搜索)
本题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side。
xindoo
2021/01/22
2250
POJ 2653--Pick-up sticks(判断线段相交)
Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 14568 Accepted: 5510 Description
Enterprise_
2019/02/20
4040
你还不会暴力搜索吗,dfs(深度优先搜索)详解,看这一篇就够啦
🚀欢迎互三👉: 2的n次方_💎💎 🚀所属专栏:数据结构与算法学习⭐⭐
2的n次方
2024/10/15
1.7K0
你还不会暴力搜索吗,dfs(深度优先搜索)详解,看这一篇就够啦
算法学习笔记-回溯
一、排列问题 1、leetcode第46题:https://leetcode-cn.com/problems/permutations/ //这就是一个单纯的排列问题,不要求前面的数必须在前面,要求就是每个数只能出现一次:无重复数字 class Solution { private: vector <int> tmp; vector <vector <int>> res; int vis[10] = {0}; public:
买唯送忧
2021/06/15
4860
POJ--1699 Best Sequence(DP+dfs)
Best Sequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5543 Accepted: 2188 Description The twenty-first century is a biology-technology developing century. One of the most attractive and challenging tasks is on the gene pro
ShenduCC
2018/04/25
6680
HDU 1010 Tempter of the Bone(dfs+剪枝)
       题意是问从S出发,终点为D,如果能刚好k步到达终点就输出YES,否则输出NO。如果直接深搜会超时,所以这里需要进行奇偶剪枝。
Ch_Zaqdt
2019/01/10
3120
P1120 小木棍 [数据加强版]
题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。 给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。 输入输出格式 输入格式: 输入文件共有二行。 第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65 (管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!) 第二行为N个用空个隔开的正整数,表示N根小木棍的长度。 输出格式: 输出文件仅一行,表示要求的原始木棍
attack
2018/04/12
7190
图论--网络流--最大流 HDU 2883 kebab(离散化)
Problem Description Almost everyone likes kebabs nowadays (Here a kebab means pieces of meat grilled
风骨散人Chiam
2020/10/28
2880
【题解】吃奶酪(剪枝优化+状态压缩)
房间里放着 n 块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 (0,0) 点处。
fishhh
2022/08/30
3770
【题解】吃奶酪(剪枝优化+状态压缩)
【算法】DFS、BFS、floodfill、记忆化搜索
要将a柱上n个的盘子借助b柱放到c柱上,应该先将a柱上的n-1个盘子借助c放到b上,然后再将b柱上的n-1个盘子借助a柱放到c柱上,以此往复。
_小羊_
2025/03/22
1230
【算法】DFS、BFS、floodfill、记忆化搜索
hotumoyi吉他_木棒能做什么
乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过 50 个长度单位。
全栈程序员站长
2022/09/22
5190
相关推荐
挑战程序竞赛系列(31):4.5剪枝
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验