递归实现组合型枚举

17 阅读2分钟

题目描述

image.png

image.png 题目链接www.acwing.com/problem/con…


思路解析

这道题是一道非常经典的递归问题的题目,由题意可知,我们要输出所有可能的选择方案,且按字典序的排列方式输出,因此我们可以先画一棵递归搜索树来方便我们理解选择方案的具体步骤:

以n=4,m=2为例:

image.png

由图可知,我们可以定义一个变量u来表示当前递归的层数,再定义path数组记录根节点到叶节点的路径,用start表示开始选择第几个数,例如u=2,start=2时,则表示路径中的第1个数已经选择完毕,开始选择路径中的第2个数;每当层数u大于m时,则停止递归输出路径中的值即可,且每条路径已经自动按字典序排好了序,不需要我们再做多余的操作,下面是代码实现:


代码实现

#include<iostream>
using namespace std;

const int N = 30;// 表示n的最大值

int n, m;// n表示有多少个数,m表示从n中选多少个数
int path[N];// 记录根节点到叶节点的路径

// u表示层数,start表示开始选择第几个数
void dfs(int u, int start)
{
	if (u > m)
	// 每当u大于m时,输出path数组中的值(路径)
	{
		for (int i = 1; i <= m; i++)
			cout << path[i] << ' ';// 每个数之间隔一个空格
		cout << endl;// 换行
	}
	else
	{
		// 选择路径
		for (int i = start; i <= n; i++)
		{
			// 表示选择的第u个数为i
			path[u] = i;
			// 到此时已经选择完第u个数,开始选择下一个数
			dfs(u + 1, i + 1);
		}
	}
}

int main()
{
	cin >> n >> m;
	dfs(1, 1);// 开始选择第一个数

	return 0;
}

运行结果:

image.png


这道题的介绍到这里就结束了,如果你觉得本篇文章对你多少有些帮助,可以点个赞或者收藏一波支持一下哦,欢迎各位大佬批评指正,咱们下一道题再见!