题解

暴搜的思路容易想到,但是剪枝细节有很多,数据很强。
搜索思路:
a. 用dfs(left_num,left_len,bound)表示当前还需要拼left_num根木棒,当前正在拼的木棒还剩left_len长度,搜索是从大往小搜索,并且当前搜索到了bound位置。
b. 每次拼一根木棒都相当于是从大到小搜索一遍所有可用的小木棒。
剪枝的思路:

  1. 拼小木棒的时候从大到小枚举。
  2. 当前枚举的小木棒a[i]如果是拼成一根大木棒的最后一根小木棒,但是最后却没有拼成所有的大木棒,那么直接从此返回失败。因为如果之后的小木棒组合能拼成所有的大木棒,那么可以将a[i]与其中的一些做置换,得到等效局面。
  3. 假设某根大木棒刚要开始枚举,剩余要找长度为目标大木棒长度,但是没有拼成所有的大木棒,那么直接返回失败。因为这表明无法再继续拼成任何一根大木棒了。
    4.如果当前拼接长度为a[i]的木棒发生失败,那么任何长度等于a[i]的木棒都可以直接跳过。

##代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100;
int a[maxn],vis[maxn];
int n,tot,len;
bool dfs(int left_num,int left_len,int bound){//表示剩余要拼left_num根木棒,当前再拼的剩余left_len,下一个从bound开始if(left_num == 0 && left_len == 0) return true;if(left_len == 0){return dfs(left_num-1,len,tot-1);}for(int i = bound;i >= 0;--i){if(vis[i]) continue;if(a[0] > left_len) return false;vis[i] = 1;if(dfs(left_num,left_len-a[i],i-1)) return true;vis[i] = 0;if(left_len - a[i] == 0 || left_len == len) return false;while(i && a[i-1] == a[i]) --i;}return false;
}
int main(){scanf("%d",&n);int mi = 0,sum = 0;for(int i = 0;i < n;++i) {int tmp;scanf("%d",&tmp);if(tmp > 50) continue;a[tot++] = tmp;sum += tmp;mi = max(mi,tmp);}sort(a,a+tot);for(len = mi;len <= sum / 2;++len){if(sum % len != 0) continue;memset(vis,0,sizeof(vis));if(dfs(sum/len,0,0))return 0*printf("%d\n",len);}printf("%d\n",sum);return 0;
}

洛谷P1120小木棒 爆搜+剪枝相关推荐

  1. 洛谷[P1120 小木棍]

    洛谷[P1120 小木棍] 题目: 思路: 枚举小木棒可能的长度,从数组最大值开始枚举,这个值能被总长度整除才是可行的 在使用dfs枚举小木棒的每一种可能,如果不可能就找下一个可能的长度开始枚举 注意 ...

  2. 洛谷 P1120 小木棍 题解

    这就是一道明显的爆搜题(人家洛谷也说了,,,),只是需要几个小小的优化,接下来为大家介绍一下: 1.将木棍先排个序(用处后面会讲),记住 长度>50 的要去掉 2.因为每一根的长度都不大于50, ...

  3. 洛谷P1120小木棍

    肝了一天的题了,求过 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度 ...

  4. 洛谷 P4430 小猴打架

    洛谷 P4430 小猴打架 题目描述 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打 ...

  5. 2017提高组D1T1 洛谷P3951 小凯的疑惑

    洛谷P3951 小凯的疑惑 原题 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想 ...

  6. 【BZOJ-18532393】幸运数字Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 1817  Solved: 665 [Submit][Statu ...

  7. 洛谷 P2186 小Z的栈函数

    洛谷 P2186 小Z的栈函数 题目 题目描述 小Z最近发现了一个神奇的机器,这个机器的所有操作都是通过维护一个栈来完成的,它支持如下11个操作: NUM X:栈顶放入X. POP:抛弃栈顶元素. I ...

  8. (最小割)洛谷P1361 小M的作物

    洛谷P1361 小M的作物 思路: 这是一个两者取一的模型,将点集一分为二. 最小割在数值上等同于最大流.割去权值和最小的边,使图分成两部分,割下来的边权值和为最小割. 对于此题,先不考虑种在一起的情 ...

  9. 【01背包求方案数模板】洛谷 P1164 小A点菜

    洛谷 P1164 小A点菜 https://www.luogu.org/problemnew/show/P1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆, ...

最新文章

  1. 在计算机网络中光缆的工作原理是什么,计算机网络原理期中考试试卷(A)
  2. HTML5实现手势屏幕解锁
  3. 怎么不让html网页自动跳转,javascript怎么禁止跳转页面?
  4. linux命令tcpdump
  5. 数据结构之图(2-2)【邻接多重表】适用于无向图
  6. MAT之SVM/BP:SVR(better)和BP两种方法比较且实现建筑物钢筋混凝土抗压强度预测
  7. 【译】Everything You Need to Know About Decentralized AI
  8. Vue报错bash: vue: command not found或者vue ui没有反应:官方修改成新的命令了
  9. 厚积薄发,拥抱 .NET 2016
  10. BP神经网络反向传播手动推导
  11. 禅道备份功能_更新禅道燃尽图及数据备份
  12. 第一章 计算机网络 5 分层结构/协议/接口/服务的概念 [计算机网络笔记]
  13. 怎么将一个数字高低位互换_多彩数字 多彩童年——东城幼儿园玩具研究教学案例...
  14. redis学习-redis事务
  15. Linux系统Bash的常用功能(9)
  16. Jenkins 在Windows下插件无法安装问题解决
  17. Oracle安装与操作系统用户组
  18. android 文件流转换为zip文件_PDF文件如何转换为TXT文本?教您一招高效转换的方法...
  19. 1月16日学习内容整理:存储库MongoDB之pymongo模块
  20. 国内外智慧医疗云平台调研

热门文章

  1. linux中wine yum安装,分享|在基于RedHat或Debian的系统上安装 Wine 1.7
  2. python——学习笔记1
  3. 7-1 内存分区分配--首次适应算法 (100 分)
  4. [Redis6]Bitmaps与set对比
  5. random(随机函数生成)
  6. b树与b+树的区别_面试必考:B树、B树、B+树、B*树图文详解
  7. 6-7 求链表的倒数第m个元素 (25 分)
  8. 怎样打造一个分布式数据库
  9. 多项式对数函数ln f(x)
  10. Tree UVALive - 8212