递归实现组合型枚举(acwing)

题目描述:

从 1∼n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。

输入格式:

两个整数 n,m ,在同一行用空格隔开。

输出格式:

按照从小到大的顺序输出所有方案,每行 1 个。

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。

数据范围:

n>0,
0≤m≤n ,
n+(n−m)≤25

输入样例:

5 3

输出样例:

1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 

分析步骤

  第一:理清思路:

  1. 我们要从n个数中选择m个数进行组合,非常明显我们要运用递归去搜索所有的方案,所以我们选择DFS求解,这道题目也是DFS的模板题之一,主要是让我们了解组合型的枚举。注意组合和排列的关系!这三道模板题,大家一定要好好记住,DFS在蓝桥杯是必考的!

  2. 我们可以去按顺序枚举每一个数,看看这个数到底选不选,如果选择则给他收到数组里去,再去递归,在递归中就跳到这个数的后面去进行选择,直到我们已经选择了m个数那么就把这几个数输出出来,在返回,递归完成之后就恢复现场

  第二:书写主函数,构建整体框架:

  1. 输入值,进入dfs搜索。第一个1代表着我们已经选择了几个数了,如果x>m的话,就代表着我们已经选择出了我们要的数,把他们输出出来就可以。

  2. 第二个1代表着我们从第几个位置开始枚举,因为题目中说了我们要按照:同一行内的数升序排列,对于两个不同的行字典序较小的排在前面,我们只要按照顺序去查找我们就可以天然的输出题目中要求的顺序,因为我们是从小到大去找的!

int main()
{cin>>n>>m;dfs(1,1);return 0 ; 
}

  第三:书写DFS函数:

  1. 书写DFS我一般是先写结束的条件。我们想想这道题目结束条件是不是就是选择了m个数就行了,所以只要x>m了就代表找到了数,然后按顺序输出就可以

  2. 如果我们还没有m个数,就代表着我们还没有结束就还得继续递归,所以我们运用for循环按顺序向后去查找,但是每递归一次我们的for循环开始的值都得从start开始。因为我们要符合题目的顺序,每递归一次我们都找到了一个数,那么我们就应该在这个数的后面再找数,只有这样我们才可以找到符合题目的顺序的组合数。

  3. 找到了之后我们在恢复现场。其实也可以不还原,但为了方便理解强烈建议大家要写这一步。对于有一部分题目还原必不可少

void dfs(int x , int start){if(x > m){for(int i = 1 ; i <= m ; i ++){cout<<path[i]<<" ";}cout<<endl;}else{for(int i = start ; i <= n ; i ++){path[x] = i;dfs(x+1,i+1);path[x] = 0;}}
}

代码:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 30;int n , m ;
int path[N];void dfs(int x , int start){if(x > m){for(int i = 1 ; i <= m ; i ++){cout<<path[i]<<" ";}cout<<endl;}else{for(int i = start ; i <= n ; i ++){path[x] = i;dfs(x+1,i+1);path[x] = 0;}}
}int main()
{cin>>n>>m;dfs(1,1);return 0 ; 
}

注意:递归实现排列型枚举;递归实现组合型枚举;递归实现指数型枚举。这三道题目代表了DFS三大标准题型,学会这三道模板题目才有可能继续去学习更难的DFS

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

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

相关文章

机器学习 - multi-class 数据集训练 (含代码)

直接上代码 # Multi-class datasetimport numpy as np RANDOM_SEED 42 np.random.seed(RANDOM_SEED) N 100 # number of points per class D 2 # dimensionality K 3 # number of classes X np.zeros((N*K, D)) y np.zeros(N*K, dtypeuint8) for j in range(K):ix rang…

摆动序列(力扣376)

文章目录 题目前知题解一、思路二、解题方法三、Code 总结 题目 Problem: 376. 摆动序列 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元…

C语言程序编译全流程,从源代码到二进制

源程序 对于一个最简单的程序&#xff1a; int main(){int a 1;int b 2;int c a b;return 0; }预处理 处理源代码中的宏指令&#xff0c;例如#include等 clang -E test.c处理结果&#xff1a; # 1 "test.c" # 1 "<built-in>" 1 # 1 "&…

本地Windows打包启动前端后台

本地Windows打包启动前端后台 1、安装jdk Windows JDK安装 2、Nginx 2.1、将 nginx-1.16.1文件夹复制到D:\home\jisapp目录下 2.2、域名证书配置&#xff1a; 将域名证书放到D:\home\jisapp\ssl\2023目录下->配置nginx.conf文件&#xff08;D:\home\jisapp\nginx-1.22.0…

智能感应门改造工程

今天记录一下物联网专业学的工程步骤及实施过程 智能感应门改造工程 1 规划设计1.1 项目设备清单1.2项目接线图 软件设计信号流 设备安装与调试工程函数 验收 1 规划设计 1.1 项目设备清单 1.2项目接线图 软件设计 信号流 设备安装与调试 工程函数 工程界面: using System; …

新手如何开始运营朋友圈?分享朋友圈前5条内容运营技巧!

最近加入的新伙伴比较多&#xff0c;不少伙伴反馈一个问题&#xff1a;作为新人&#xff0c;前期我们的朋友圈要如何发&#xff1f;要怎么开始发朋友&#xff1f;要怎么配图&#xff0c;怎么配文案&#xff1f; 为了解决新伙伴们的这个问题&#xff0c;今天同伙伴们分享&#…

7.二叉树的遍历方式及二叉树习题

4.二叉树链式结构的实现 二叉树是&#xff1a; 空树 非空&#xff1a;根节点&#xff0c;根节点的左子树、根节点的右子树组成的。 4.1二叉树的遍历 4.2.1 前序、中序以及后序遍历 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前…

华清远见STM32MP157开发板助力嵌入式大赛ST赛道MPU应用方向项目开发

第七届&#xff08;2024&#xff09;全国大学生嵌入式芯片与系统设计竞赛&#xff08;以下简称“大赛”&#xff09;已经拉开帷幕&#xff0c;大赛的报名热潮正席卷而来。嵌入式大赛截止今年已连续举办了七届&#xff0c;为教育部认可的全国普通高校大学生国家级A类赛事&#x…

数据结构和算法:分治

分治算法 分治&#xff08;divide and conquer&#xff09;&#xff0c;全称分而治之&#xff0c;是一种非常重要且常见的算法策略。分治通常基于递归实现&#xff0c;包括“分”和“治”两个步骤。 1.分&#xff08;划分阶段&#xff09;&#xff1a;递归地将原问题分解为两个…

Spring源码解析-容器基本实现

spring源码解析 整体架构 defaultListableBeanFactory xmlBeanDefinitionReader 创建XmlBeanFactory 对资源文件进行加载–Resource 利用LoadBeandefinitions(resource)方法加载配置中的bean loadBeandefinitions加载步骤 doLoadBeanDefinition xml配置模式 validationMode 获…

Open CASCADE学习|放样建模

在CAD软件中&#xff0c;Loft&#xff08;放样&#xff09;功能则是用于创建三维实体或曲面的重要工具。通过选取两个或多个横截面&#xff0c;并沿这些横截面进行放样&#xff0c;可以生成复杂的三维模型。在CAD放样功能的操作中&#xff0c;用户可以选择不同的选项来定制放样…

二分答案 蓝桥杯 2022 省A 青蛙过河

有些地方需要解释&#xff1a; 1.从学校到家和从家到学校&#xff0c;跳跃都是一样的&#xff0c;直接看作2*x次过河就可以。 2.对于一个跳跃能力 y&#xff0c;青蛙能跳过河 2x 次&#xff0c;当且仅当对于每个长度为 y 的区间&#xff0c;这个区间内 h 的和都大于等于…