洛谷 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. 现在,他想把小木棍拼接 ...
随机推荐
- [基础]C++:名字的作用域
每个名字都有自己的活动空间,同一个名字在不同的作用域可能指向不同的实体. 作用域:通常是以{}为分隔. 名字的有效区域开始于名字的声明,以声明语句所在的末端为结束. #include<iostr ...
- day44——索引、explain、慢查询、数据备份、锁、事务
day44 索引介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还有一些复杂的查询操作 ...
- MySQL直方图
MySQL8.0开始支持索引之外的数据分布统计信息可选项 我们知道,在DB中,优化器负责将SQL转换为很多个不同的执行计划,完了从中选择一个最优的来实际执行.但是有时候优化器选择的最终计划有可能随着D ...
- 什么是openshift
Openshift是一个开源的容器云平台,底层基于当前容器的事实标准编排系统Kubernetes和docker引擎,企业可以基于此平台搭建内部Paas平台,贯穿CI/CD流程,提高企业IT效率,拥抱D ...
- 服务端php之文件上传
知识点 echo $_SERVER['PHP_SELF']; 自动获取当前文件的路劲(即提交地址为当前页面) 当一个表单有文件域(即文件上传)的时候,method(提交方式)要设置post,这样更加安 ...
- SQL 基本概念、通用语法与分类
一.SQL 概念 1.什么是 SQL Structured Query Language 结构化查询语句 2.SQL 作用 (1)是一种所有关系型数据库的查询规范,不同的数据库都支持. (2)通用 ...
- Fortify漏洞之Portability Flaw: Locale Dependent Comparison
继续对Fortify的漏洞进行总结,本篇主要针对 Portability Flaw: Locale Dependent Comparison 漏洞进行总结,如下: 1.Portability Flaw ...
- FreeRTOS二值信号量
API函数 #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xSemaphoreCreateBinary() xQueueGenericCre ...
- viewer 图片点击放大 用法汇总
A 不用viewer插件 1弹出框 https://www.cnblogs.com/web1/p/8989967.html 2表格中 https://www.jianshu.com/p/c17f4f6 ...
- SetCurrentCellAddressCore 函数的可重入调用
绑定数据在线程中 private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { if (Di ...