蓝桥杯-Sticks-DFS搜索

题目

样例输出是

6
5

题目中给错了,不知道什么时候会改。

思路

--剪枝,否则时间复杂度和空间复杂度过大,会超时。

--注意有多组测试样例时,需要将bool数组重新赋值为false。

--函数类型不是void,return语句不能省略!

--思路:刚开始想的大方向是对的,将需要处理的数组排序,然后从最大值到总和这个范围内搜索,找满足题意的木棍长度,但是剪枝这里是一头雾水。剪枝是利用一些条件使得不需要dfs许多重复的情况,已经pass掉的就不需要再递归了。看到这一题,很容易联想到粘木棍,将n个短木棍粘成m个长木棍,所不同的是,这里的m个长木棍长度都是相同的。我们可以一根一根来粘,粘成一根长木棍再粘下一根。那么就需要让此时的长木棍的长度作为参数在递归中传递。这时有三种情况,当前长度cur加上选中的短木棍的长度,可能等于、大于、小于目标长度l。(1)如果等于l,开始粘下一根长木棍,长木棍的根数要+1,cur设为0,验证接下来能不能递归成功,如果成功就可以直接返回,如果不成功就返回false,提前结束递归。验证接下来能不能递归成功,就是为了在不成功的情况下提前结束递归。(2)如果大于l,说明选中的短木棍不合适,需要继续循环遍历下一个短木棍。没有必要验证了,因为肯定会返回false的。(3)如果小于l,说明还没有粘完,还需要继续粘,也要继续循环遍历下一个短木棍。判断接下来能不能递归成功,如果不成功的话,并且cur为0,返回false。为什么只有在cur为0的时候才返回?因为如果当前长度不为0,并且拼接接下来的短木棍仍然不成功,说明此时选择的短木棍不对,需要继续for循环选择下一个合适的短木棍;如果当前长度为0,但不成功,说明在以后的递归中也不可能成功了,就直接false。

代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;int n; //短木棍的个数 
int l; //长木棍的长度 
int num; //长木棍的个数 
vector<int> v(65);
bool b[65] = {false}; bool dfs(int s, int j, int cur){ //遍历小木棍的起始位置,拼成的长木棍数目,长木棍当前长度 if (j == num){return true;}for (int i = s; i < n; i++){if (b[i] == true || (i != 0 && v[i] == v[i - 1] && b[i - 1] == false)){continue;} //如果这根木棍已被访问过 或 和上一根没有被访问过的木棍长度相同,剪枝。if (cur + v[i] == l){b[i] = true;if (dfs(0, j + 1, 0)){return true;} //如果继续深度递归能成功,直接返回。 b[i] = false;return false; //如果不能成功,提前终止。 }if (cur + v[i] < l){b[i] = true;if (dfs(i + 1, j, cur + v[i])){ //i + 1,不是s + 1! return true;} //如果继续深度递归能成功,直接返回。 b[i] = false; if (cur == 0){return false;} //不能成功,如果当前长度为0,说明还没有开始拼接 或 已经拼接成了几根,上面的if已经尝试过所有的v[i]了,所以不可能成功。如果当前长度不为0,还可以尝试接下来的v[i]。 } //如果cur + v[i] > l,那么就需要换下一个v[i]来尝试。 }return false; //不是void类型的,不能省略return语句。 
}int main(){while (cin >> n && n != 0){int sum = 0;for (int i = 0; i < n; i++){cin >> v[i];sum += v[i];}sort(v.begin(), v.begin() + n, greater<int>()); //从大到小深度搜索,比较好找。for (int i = v[0]; i <= sum; i++){if (sum % i == 0){memset(b, 0, sizeof(b)); //问题出在这里!需要将b数组重置为false,因为有多组测试用例! l = i;num = sum / l;if (dfs(0, 0, 0)){cout << l << endl;break;}} }}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【FPGA】摄像头模块OV5640

本篇文章包含的内容 一、OV5640简介1.1 基本概述1.2 工作时序1.2.1 DVP Timing&#xff08;数据传输时序&#xff09;1.2.2 帧曝光工作模式 1.3 OV5640 闪光灯工作模式1.3.1 Xenon Flash&#xff08;氙灯闪烁&#xff09;模式1.3.2 LED 1&2 模式1.3.3 LED 3模式1.3.4 手动开…

Re62:读论文 GPT-2 Language Models are Unsupervised Multitask Learners

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;Language Models are Unsupervised Multitask Learners 论文下载地址&#xff1a;https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learner…

接口测试开始前做什么?这10步缺一不可!

在进行接口测试之前&#xff0c;测试工程师需要进行一系列的准备工作&#xff0c;以确保测试的顺利进行。以下是接口测试开始之前的准备工作&#xff0c;并附有示例说明&#xff1a; 1. 了解项目和接口文档&#xff1a; 在开始测试之前&#xff0c;测试工程师需要仔细阅读项目…

Android 系统源码快速入门

Android源码快速入门 今天分享的内容是Android源码快速入门&#xff0c;主要分为以下几个步骤&#xff1a; * 硬件要求 * 虚拟机安装 * 开发环境搭建 * 下载编译源码 * 从一个简单的实际开发需求体验 Framework 开发硬件要求 用于 Android Framework 开发的电脑需要较强的 C…

sqlserver列出表的所有字段名

1、纵向列出所有字段 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME tablename;2、横向列车所有字段&#xff0c;以‘&#xff0c;’分隔 SELECT STUFF((SELECT , column_nameFROM information_schema.columnsWHERE table_name tablenameFOR XM…

使用 Python 编写网络爬虫:从入门到实战

网络爬虫是一种自动化获取网页信息的程序&#xff0c;通常用于数据采集、信息监控等领域。Python 是一种广泛应用于网络爬虫开发的编程语言&#xff0c;具有丰富的库和框架来简化爬虫的编写和执行过程。本文将介绍如何使用 Python 编写网络爬虫&#xff0c;包括基本原理、常用库…

实地研究降本增效的杀伤力,LSTM算法实现全国失业率分析预测

前言 ​ 降本增效降本增笑&#xff1f;增不增效暂且不清楚&#xff0c;但是这段时间大厂的产品频繁出现服务器宕机和产品BUG确实是十分增笑。目前来看降本增效这一理念还会不断渗透到各行各业&#xff0c;不单单只是互联网这块了&#xff0c;那么对于目前就业最为严峻的一段时…

zynq7000 neon 裸机编译

最近想用zynq7000跑下neon&#xff0c;所以就开始折腾。 因为ne10不能用在裸机上&#xff0c;所以盯上了cmsis_dsp。因为这个库可以在cortex-a和cortex-m上面跑&#xff0c;而zynq7000用的是cortex-a9。应该是可以跑的。在这里特别感谢大佬的文章&#xff0c;少走不少弯路。 …

Cinema 4D 2024 for mac/Win:开启三维动画与建模新纪元

在数字化时代&#xff0c;三维动画与建模已成为影视、游戏、广告等多个领域不可或缺的创作工具。而Cinema 4D&#xff0c;作为这一领域的佼佼者&#xff0c;始终以其卓越的性能和创新的功能引领着行业的发展。如今&#xff0c;Cinema 4D 2024的发布&#xff0c;更是为我们带来了…

键盘映射工具KeyTweak的使用,把F9和F10改为 Home、End

如果你的笔记本没有Home、End键 对于写文字和写代码影响还是比较大的 下面使用键盘映射工具KeyTweak 把F9和F10分别改为 Home、End 然后点击ok 电脑重启后 就生效了 很好用 完美解决 小尺寸笔记本 的按键少的烦恼 可以自己再琢磨琢磨 去映射 符合自己需求的按键 软件下载链接&…

【早鸟优惠|高录用|EI稳定检索】2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)诚邀投稿/参会!

【早鸟优惠|高录用|EI稳定检索】 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;ICVISP 2024&#xff09;诚邀投稿/参会&#xff01; # 早鸟优惠 # 先投稿先送审 # #投稿免费参会、口头汇报及海报展示# 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;I…

Golang案例开发之gopacket抓包入门(1)

文章目录 前言一、gopacket是什么&#xff1f;二、gopacket前提二、实践 枚举主机上网络设备的接口1、代码2、结果文档 总结 前言 说起网络抓包&#xff0c;我们一定听过大名鼎鼎的Tcpdump和WireShark。他们分别是Linux平台和Windows平台的抓包工具。 Wireshark抓包工具&…

杉德支付配合调查 - 数字藏品服务

最近&#xff0c;数字收藏品平台淘派发布了一则公告&#xff0c;宣布支付通道杉德已暂停接口服务&#xff0c;以配合调查。 近期发现多个异常账户&#xff0c;涉嫌盗取他人信息和银行卡&#xff0c;利用平台从事非法交易。淘派已第一时间报警&#xff0c;协助警方追回资金(回执…

idea maven 项目融合

背景 &#xff1a;项目A 和项目B 是两个独立的多模块项目&#xff0c;项目A 和项目B &#xff0c;均为独立的数据源 。其中项目B 有两个数据原。 需要将项目B 以多模块的方式融合进项目A。 解决版本。建立项目C&#xff0c;只含有pom的&#xff0c;空项目&#xff0c;项目A和项…

RPM与DNF的操作实践

这几课有三个目标&#xff1a; 第一步&#xff1a;先配置软件源 跳转到yum.repos.d目录&#xff0c;用vim创建一个openeuler_x84_64.repo文件。这个文件就是我们将会用到的软件源。 我们在里面添加这些东西&#xff0c;保存并退出即可。 然后&#xff0c;我们用yum list all就…

阿里云发布 AI 编程助手 “通义灵码”——VSCode更强了 !!

文章目录 什么是 通义灵码&#xff08;TONGYI Lingma&#xff09; 快速体验“通义灵码” 什么是“通义灵码”&#xff08;TONGYI Lingma&#xff09; 通义灵码&#xff08;TONGYI Lingma&#xff09;&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff…

C语言字符函数和字符串函数以及内存函数(全是代码版):一篇文章让你秒懂基础!

JAMES别扣了-CSDN博客&#xff08;个人主页&#xff09; &#x1f495;在校大学生一枚。对IT有着极其浓厚的兴趣 ✨系列专栏目前为C语言初阶、后续会更新c语言的学习方法以及c题目分享. &#x1f60d;希望我的文章对大家有着不一样的帮助&#xff0c;欢迎大家关注我&#xff0c…

【Java常用API】正则表达式练习

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

Excel新函数TEXTJOIN太强大了,这些高级用法太实用了

今天跟大家分享WPS中新函数TEXTJOIN的使用方法和技巧&#xff0c;它不仅仅是一个强大的文本连接函数&#xff0c;还有一些高级用法可以帮助我们快速解决日常难题。 TEXTJOIN函数介绍 作用&#xff1a;TEXTJOIN函数是文本连接函数&#xff0c;使用分隔符连接列表或文本字符串区…

【C++】手撕AVL树

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能直接手撕AVL树。 > 毒鸡汤&#xff1a;放弃自…