洛谷 P1120 小木棍 dfs+剪枝
Problem Description
[题目链接] https://www.luogu.com.cn/problem/P1120
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。
现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。
给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
Input
共二行。
第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65
Output
一个数,表示要求的原始木棍的最小可能长度
Sample Input
9
5 2 1 5 2 1 5 2 1
Sample Output
6
Analysis of ideas
枚举每个可能的长度,从最长的开始,到木棍长度之和(一根)
剪枝非常非常关键
我觉得最重要的剪枝,也是卡了我最久的剪枝if(len == 0 || aim-len == a[i]) return false;
主要分析一下这句话,当这句话执行的时候说明什么?说明回溯了,而如果回溯了的话说明什么,说明前面dfs没有返回true,当len回溯回0的时候,说明一开始选的这根木棍,拼不成aim长度,那么就没必要搜了,另一个就是当len+a[i] == aim都没有返回true,那也没必要搜了
其他的剪枝看代码吧
Accepted code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define cin(a) scanf("%d",&a)
#define pii pair<int,int>
#define ll long long
#define gcd __gcd
const int inf = 0x3f3f3f3f;
const int maxn = 100;
int n,m,t,sum,aim; //t是有效木棍根数,sum是木棍总长度,aim是目标长度
int a[maxn]; //木棍长度
bool vis[maxn];
bool dfs(int cnt,int len, int pos) //还要拼的根数,拼了的长度,以及下标
{
if(cnt == 1) return true; //拼成功了
if(len == aim) return dfs(cnt-1,0,0);
for(int i = pos; i < t; i++) //a从小到大排序
{
if(!vis[i] && len+a[i] <= aim) //选取长度不超过aim的
{
vis[i] = 1;
if(dfs(cnt,len+a[i],i+1)) return true;
vis[i] = 0; //回溯
if(len == 0 || aim-len == a[i]) return false; //拼失败了
while(i+1 < n && a[i+1] == a[i]) i++; //长度一样的没必要重复搜索
}
}
return false;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
scanf("%d",&m);
if(m <= 50)
{
a[t++] = m;
sum += m;
}
}
sort(a,a+t,greater<int>()); //从大到小排序
int ans = 0;
for(int i = a[0]; i <= sum; i++) //i是枚举长度
{
if(sum%i == 0) //dfs能被sum整除的i
{
for(int i = 0; i < t; i++) vis[i] = 0;
aim = i; //要拼的长度
if(dfs(sum/i,0,0))
{
ans = i;
break;
}
}
}
printf("%d\n",ans);
return 0;
}
洛谷 P1120 小木棍 dfs+剪枝的更多相关文章
- 洛谷P1120小木棍[DFS]
题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...
- 洛谷P1120 小木棍 [数据加强版](搜索)
洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...
- 洛谷P1120 小木棍
洛谷1120 小木棍 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长 ...
- 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)
洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ...
- 洛谷 P1120 小木棍 [数据加强版]解题报告
P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ...
- 洛谷——P1120 小木棍 [数据加强版]
P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍 ...
- 洛谷 P1120 小木棍 [数据加强版]
P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ...
- 洛谷P1120 小木棍 [搜索]
题目传送门 题目描述乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍 ...
- 洛谷—— P1120 小木棍 [数据加强版]
https://www.luogu.org/problem/show?pid=1120 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接 ...
随机推荐
- Django总结篇
1.0 简述http协议和常用请求头 http协议: ( 基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)) HTTP协议是Hyper Text Transfer Pro ...
- vue中$router与$route的区别
$.router是VueRouter的实例,相当于一个全局的路由器对象.包含很多属性和子对象,例如history对象 $.route表示当前正在跳转的路由对象.可以通过$.route获取到name,p ...
- maven打包spring boot项目及跳过test文件
打包命令 mvn clean package // 会先清理现有的target目录 or mvn package 跳过测试文件 1. idea全局配置 右侧maven会取消test选项 2. 命令行附 ...
- vue3 父组件给子组件传值 provide & inject
介绍 provide() 和 inject() 可以实现嵌套组件之间的数据传递. 这两个函数只能在 setup() 函数中使用. 父级组件中使用 provide() 函数向下传递数据. 子级组件中使用 ...
- docker postgres 导出导入数据
导出 -s 选项用来只导出表结构,而不会导出表中的数据 -t 选项用来指定要导出的数据库表 格式:docker exec -ti 容器名 pg_dump -U 用户名 -s -t table_n ...
- linux BufferedImage.createGraphics()卡住不动
项目应用服务器tomcat7,在开发(windows).测试环境(linux 64bit)均正常.在生产环境(linux 64bit)一直启动不起来,也没有报错. 最终定位问题:执行到buffered ...
- Python 3 MySQL数据库操作
import pymysql class Mysql_db(): def __init__(self,ip,username,password,db_name,table_name): self.ip ...
- VS2017 配置 boost_1_70
1. 下载与安装 1.1 安装方法1 (1) 下载 https://www.boost.org/ 或者使用 https://sourceforge.net/projects/boost/files/b ...
- python day 8: re模块补充,导入模块,hashlib模块,字符串格式化,模块知识拾遗,requests模块初识
目录 python day 8 1. re模块补充 2. import模块导入 3. os模块 4. hashlib模块 5. 字符串格式:百分号法与format方法 6. 模块知识拾遗 7. req ...
- C# 将Excel导出PDF
1.安装所需包,使用nuget安装所需包 1.1.Spire.Xls 1.2.iTextSharp.text.pdf 2.Spire.Xls介绍 将Excel转换为PDF是一个很常用的功能,常见的转换 ...