【数据结构入门训练DAY-30】数的划分

文章目录

前言

本次训练内容

  1. 训练DFS。
  2. 训练解题思维。

一、题目

将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。

例如:n=7,k=3,下面三种分法被认为是相同的。

{1,1,5};{1,5,1};{5,1,1};

问有多少种不同的分法。 输出一个整数,即不同的分法。

输入格式

两个整数n,k(6<n≤200,2≤k≤6),中间用单个空格隔开。

输出格式

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

样例输入

复制代码
7 3

样例输出

复制代码
4

二、解题思路

这道题目就是要我们按照对应的拆分值,拆开成对应拆分值个数,然后那个拆分出来数的和要等于原数才算成功。我先为题中的两数建立宏定义,因为自定义函数中要使用,然后定义函数时的参数分别是1.当前处理的分割层数(从1开始)2.当前层可选择的最小值(保证后续数不小于当前数,避免重复)3.已选数的总和;然后题中输出为所有符合的次数,所以我就再宏定义一个计数器,原因也是自定义函数需要。创建自定函数后并设置对应的三个形参,然后我先判断计数条件和返回调用的情况,然后接着就是递归回溯过程。实现代码如下:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define Max 200
int sum=0;
int n,k;
int arry[Max];//存储块值数组
void DFS(int a,int b,int c) {//思路里对应的三个形参
    if (a>k) {
        if (c==n) {//判断计数器增加条件
            sum++;
        }
        return;//返回调用
    }
    for (int i=b;i<=n-c;i++) {
        arry[a]=i;//把可能值存入数组
        DFS(a+1,i,c+i);//递归过程
    }
}
int main() {
    cin>>n>>k;
    DFS(1,1,0);
    cout<<sum;
}

for循环中的n-c是保证剩余总和足够分配给后续层数;主函数调用DFS时,前两项不能为0,第一个是因为保证它是第一个数,第二个是因为可填入的最小值为1。

总结

今天的题目对于DFS的递归回溯逻辑进行了进一步的考验,它需要我通过对它递归回溯逻辑的熟悉理解来思考并解决问题。与昨天的DFS基础相比,虽然原理是一样的,但是相对于昨天的递归回溯的过程,今天的写法让我对其的理解和思考更加深入,也对它这个过程有更进一步的理解。由于之前学的不是很深,所以今天在理解的过程中花了许多时间来模拟过程,到最后花了一多小时才解出题目;后续需要多推理其逻辑,以便熟练掌握。

相关推荐
Allen_LVyingbo13 分钟前
信息化部门在AI时代的编程转移路径分析(上)
人工智能·python·算法·健康医疗·数据库开发·时序数据库·数据库架构
七牛云行业应用18 分钟前
Jev 报 401 / api_key_required 怎么解决:TypeSafe AI 官方错误码表与排查步骤
算法·github
晴天的雨.99230 分钟前
【C++算法】三数之和
开发语言·c++·算法
多多爱学习1 小时前
括号有几层?得看还有多少个左括号没闭合
c语言·c++·算法·面试
续写烂尾2 小时前
MK SD NAND(贴片式TF卡)替代Nor Flash:1Gb容量与256Mb Nor
算法·microsoft
u0111026752 小时前
图片预览越来越占内存聊聊 URL.createObjectURL 的释放时机
图像处理·深度学习·算法·ai作画
Zane19942 小时前
同样是遍历图,为什么BFS能保证找到最短路径,DFS却不行
算法
无限码力2 小时前
2026华为OD机试真题 新系统 9月27日【坚果巧克力】
算法·华为od·华为od机考·华为od机试真题·华为od机试·华为od机考真题题解·华为社招笔试真题
samforce2 小时前
叹息之墙——人类认知 AI,终将遇到的一堵同构之墙
人工智能·深度学习·算法·哲学·认知科学
l1t2 小时前
编译测试兼容gzip并行压缩解压工具pigz
c++·算法