AcWing 93 递归实现组合型枚举

题目描述

从 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 

本题是要我们求出组合数序列,就是在上题排列输出序列的筛选出序列数为m的序列,注意点有两点,其一,要按照字典序排序,dfs选择某数的语句要写在不选择某数语句的前面 ;其二,必要的剪枝,在原先边界条件上要进一步剪枝,比如n=5,m=3,已选择数个数大于3便不用继续递归,故k > m时停止递归,再者,比如数1,2,3都未选,再去考察4,5两个数的选择状态便没有意义了,同样需要剪枝,另一个边界就是 n - cur + k < m,即已选的加上未判断的总和小于m视为不合法的状态。

#include 
using namespace std;
int n,m;
void dfs(int cur,int k,int st){
	if(cur == n || k > m || n - cur + k < m){
		if(k == m){
			for(int i = 0;i < n;i++){
			if(st >> i & 1)	cout<>n>>m;
	dfs(0,0,0);
	return 0;
}

 

你可能感兴趣的:(算法竞赛进阶指南)