当前位置: 首页 > news >正文

【数据结构入门训练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.已选数的总和;然后题中输出为所有符合的次数,所以我就再宏定义一个计数器,原因也是自定义函数需要。创建自定函数后并设置对应的三个形参,然后我先判断计数条件和返回调用的情况,然后接着就是递归回溯过程。实现代码如下:

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

相关文章:

  • STM32F103单片机在不需要使用 JTAG 调试接口的情况下,释放引脚给其他功能使用。
  • React Hooks 精要:从入门到精通的进阶之路
  • TWAS、GWAS、FUSION
  • 【读书笔记】《编码:隐匿在计算机软硬件背后的语言》01 逻辑与开关
  • 【单片机毕业设计16-基于stm32c8t6的智慧交通灯系统设计】
  • 湖南(源点咨询)市场调研 商业综合体定位调研分享(下篇)
  • Spring Boot 中如何启用 MongoDB 事务
  • 华为云服务器核心用途全景解析:从基础服务到行业革新​​
  • # 深度学习实操 附录B 深入解析 tensorflow 自动微分
  • 【Python】装饰器在装什么
  • 递归函数(斐波那契数列0,1,1,2,3,5,8,13,21,34,55...)
  • 运放OP方向技术要点和大厂题目解析
  • LWIP的IP协议笔记
  • Java中的代理机制
  • STC32G12K128程序大于64KB使用128KB用户EEPROM设置
  • JavaWeb基础
  • 438. 找到字符串中所有字母异位词(滑动窗口)
  • Android方法耗时监控插件开发
  • vue3项目中CodeMirror的复杂用法,实现自定义语法模式,手动在指定光标位置插入/获取/替换/绑定文本
  • 当可视化遇上 CesiumJS:突破传统,打造前沿生产配套方案
  • 航行警告:渤海海峡黄海北部执行军事任务,禁止驶入
  • 苏东坡:人生就是哈哈哈哈哈
  • 李在明正式登记参选下届韩国总统
  • 4月证券私募产品备案量创23个月新高,股票策略占比超六成
  • 七方面118项任务,2025年知识产权强国建设推进计划印发
  • 视频丨习近平同普京会谈:共同弘扬正确二战史观,维护联合国权威和地位