【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(9)

news/2024/11/17 16:31:53/

目录

写在前面:

题目:P1025 [NOIP2001 提高组] 数的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述:

输入格式:

输出格式:

输入样例:

输出样例:

解题思路:

代码:

AC !!!!!!!!!!

写在最后:


写在前面:

怎么样才能学好一个算法?

我个人认为,系统性的刷题尤为重要,

所以,为了学好深度优先搜索,为了用好暴搜应对蓝桥杯,

事不宜迟,我们即刻开始刷题!

题目:P1025 [NOIP2001 提高组] 数的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述:

输入格式:

n, k (6 < n ≤ 200,2 ≤ k ≤ 6)

输出格式:

1 个整数,即不同的分法。

输入样例:

7 3

输出样例:

4

提示:

四种分法为:
1, 1, 5;
1, 2, 4;
1, 3, 3;
2, 2, 3.

解题思路:

我们使用深度优先搜索的时候,

第一个要注意的点是搜索的顺序,

因为我们要保证,

我们写出的递归结构能够遍历所有情况。

(以上递归搜索的基本思路,多熟悉总是好的)

 接下来是具体思路

我们先根据题目条件画出递归搜索树:

根节点:(以题目给出的样例为例)

从第一位置开始,我们从1开始填数字:

题目要求下一个数要大于等于前一个数,

 我们发现,题目要求最大是7,而从3开始最小的和也是9,

我们就能直接判断他是不合法的,需要剪枝。

继续递归搜索:

 我们发现,当1 + 4 + 4 > 7 , 2 + 3 + 3 > 7,这两个情况之后也需要剪枝,

总结这个剪枝的规律,其实就是:

如果当前的值的总和 + 接下来剩下位置的数量 * 起始数值 > 题目要求的值,

就不用继续递归搜索了。

继续往下递归搜索:

 我们就根据这个规律去实现代码即可:(记得剪枝)

代码:

//包含常用头文件
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;int n, k;//因为题目只需要返回计数,所以不用专门开一个数组记录,直接用一个变量计数即可
int res = 0;void dfs(int u, int start, int sum)
{//遍历完三个位置if(u > k){//如果符合条件if(sum == n)res++;return;}//如果当前的sum + 接下来剩下位置的数量 * 起始数值 > 题目要求的值,就不用继续递归搜索了for(int i = start; sum + i * (k - u + 1) <= n; i++){dfs(u + 1, i, sum + i);}
}int main()
{cin >> n >> k;dfs(1, 1, 0);printf("%d\n", res);return 0;
}

AC !!!!!!!!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。


http://www.ppmy.cn/news/35177.html

相关文章

C++三种继承方式

C继承的一般语法为&#xff1a;class 派生类名:&#xff3b;继承方式&#xff3d; 基类名{派生类新增加的成员};继承方式限定了基类成员在派生类中的访问权限&#xff0c;包括 public&#xff08;公有的&#xff09;、private&#xff08;私有的&#xff09;和 protected&#…

Node搭建后端框架【模块化,使用MySQL】

这篇文章可能和一般的使用express不到10行代码构建一个服务器不太一样&#xff0c;因为我之前有使用过springboot进行后端框架的搭建&#xff0c;所以感觉这种方法虽然简单&#xff0c;但是可能就缺乏扩展性 和 规范性 0.项目背景 当前我正在开发一个自己使用的小型项目&#…

K8S + GitLab + Jenkins自动化发布项目实践(一)

K8S GitLab Jenkins自动化发布项目实践&#xff08;一&#xff09;发布流程设计安装Docker服务部署Harbor作为镜像仓库部署GitLab作为代码仓库常用Git命令发布流程设计 #mermaid-svg-pe9VmFytb9GmqMvG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-…

Python解题 - CSDN周赛第40期

上期问哥没参加&#xff0c;但从赛后大家的反馈来看&#xff0c;又出现了数据上的bug&#xff0c;使用 python 的朋友会遇到第二个用例的柱子高度数组长度不够&#xff0c;200根柱子&#xff0c;只有179个数据&#xff0c;这让人怎么玩&#xff1f;但是用C的选手就没有这个问题…

JVM学习.04. Java内存模型与线程模型

1、前言该篇内容主要介绍JVM如何实现多线程&#xff0c;多线程间由于共享和竞争数据而导致的一系列问题以及解决方案。2、内存模型&#xff08;JMM&#xff09;Java内存模型&#xff08;Java Memory Model&#xff0c;简称JMM&#xff09;的主要目的是定义程序中各种变量的访问…

回流和重绘

系列文章目录 前端系列文章——传送门 JavaScript系列文章——传送门 文章目录系列文章目录1、浏览器渲染过程2、回流3、重绘4、优化4.1、合并样式修改4.2、批量操作DOM4.3、避免多次触发布局4.4、修改批量设置样式函数我们在做案例的时候&#xff0c;通常一个标签要设置很多样…

【嵌入式烧录/刷写文件】-1-详解Motorola S-record(S19/SREC/mot/SX)格式文件

目录 1 什么是Motorola S-record 2 Motorola S-record的格式 2.1 Motorola S-record的结构 2.1.1 “Record type记录类型”的说明 2.1.2 “Record length记录长度”的说明 2.1.3 如何计算“Checksum校验和” 2.2 Record order记录顺序 2.3 Text line terminator文本行终…

Python深度学习实战:人脸关键点(15点)检测pytorch实现

引言 人脸关键点检测即对人类面部若干个点位置进行检测&#xff0c;可以通过这些点的变化来实现许多功能&#xff0c;该技术可以应用到很多领域&#xff0c;例如捕捉人脸的关键点&#xff0c;然后驱动动画人物做相同的面部表情&#xff1b;识别人脸的面部表情&#xff0c;让机…