AcWing 93. 递归实现组合型枚举

AcWing 93. 递归实现组合型枚举

写在前面:AcWing是由北大一神级人物——“大雪菜” 创办的算法交流社区, 里面除了正常 oj 网站的功能之外, 还提供单人训练、双人匹配、云端操作系统等模式,除此之外不定期举行各种打卡活动,而且可以分享题解和心得,完全可以当成空间来玩。欢迎大家入坑。
点击前往: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. 在 AcWing 92 的基础上增加 选择过的数字数量 的参数
  2. 加个判断就行了

点击前往: AcWing 92 题解

已过代码

# include 
using namespace std;
int m,n;//在n个数中选m个数
void dfs(int u, int num, int s) {
     
//u:枚举了几个数,num:选了几个数,s:状态,选的谁
	if (num + n - u < m)return;
	//num加上剩下的所有数也不能超过m,就一定不合法
	if (num == m) {
     
	//已经选了m个数了,输出
		for (int i = 0; i < n; i++) {
     
			if (s >> i & 1) {
     
				cout << i + 1 << " ";
			}
		}
		cout << endl;
		return;
	}
	if (u == n) return;
	//枚举了n个数,没有找到合法的条件
	//以上是边界条件
	dfs(u + 1, num + 1, s | (1 << u));/*选,数量加一*/
	dfs(u + 1, num, s);//不选
}
int main(){
     
    cin>>n>>m;
    dfs(0,0,0);
}

你可能感兴趣的:(#,AcWing,c++,算法,dfs)