递归/非递归实现组合型枚举

题目描述

从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。n>0,  0<=m<=n,  n+(n-m)<=25。 

输入

一个整数n。

输出

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

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 9 12排在1 3 10 11前面)。

样例输入

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

分析:分析有什么好分析的,利用递归打印即可。

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#define range(i,a,b) for(int i=a;i<=b;++i)
#define LL long long
#define rerange(i,a,b) for(int i=a;i>=b;--i)
#define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
using namespace std;
int n,m,num[100];
vector<int>data;
void init(){
    cin>>n>>m;
    range(i,0,n-1)num[i]=i+1;
}
void dfs(int head,int len){
    range(i,head,n-len){
        int tmp=num[i];
        if(tmp){
            data.push_back(tmp);
            num[i]=0;
            if(len>1)dfs(i+1,len-1);
            else range(j,0,data.size()-1)cout<<data[j]<<(j==data.size()-1?'\n':' ');
            data.pop_back();
        }
        num[i]=tmp;
    }
}
void solve(){
    if(!m){cout<<endl;return;}
    dfs(0,m);
}
int main() {
    init();
    solve();
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/Rhythm-/p/9318174.html