递归实现指数型枚举

15 阅读2分钟

题目描述

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


思路解析

这道题是一道非常经典的递归问题的题目,由题意可知,我们要输出所有的选择方案(包括空集),且每个方案必须是递增排列,因此我们可以先画一棵递归搜索树来方便我们理解选择方案的具体步骤:

以n=3为例: image.png

由图可知,我们可以定义一个变量u来表示当前递归的层数,u的值表示是否选择第几个数,例如u=2就表示是否选择第二个数每递归一次u的值就加上1;然后可以定义一个布尔类型的数组state,用来记录选择的结果每当u>n时,直接根据遍历state的结果输出值即可,下面是代码实现:


代码实现

#include<iostream>
using namespace std;
const int N = 15;// 表示输入的最大值
int n;
bool state[N];// 表示当前数字的选择情况

// 递归
// u等于几,表示是否选择第几位的数字
void dfs(int u)
{
	// 每当u>n时,则遍历state数组,然后停止递归
	if (u > n)
	{
		for (int i = 1; i <= n; i++)
			// 如果state[i]为真,则输出选择的数
			if (state[i] == true)
				cout << i << ' ';
		// 分行,若此时没有选择任何数,则表示此情况的结果为空
		cout << endl;
		return;
	}

	// 表示选择第u个数
	state[u] = true;
	dfs(u + 1);// 递归层数+1,准备决定下一个要选择的数

	// 表示不选择第u个数
	state[u] = false;
	dfs(u + 1);// 递归层数+1,准备决定下一个要选择的数
}

int main()
{
	cin >> n;// 输入n
	dfs(1);// 从第1层开始

	return 0;
}

运行结果:

image.png


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