zoukankan      html  css  js  c++  java
  • 递归/非递归实现组合型枚举

    题目描述

    从 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?'
    ':' ');
                data.pop_back();
            }
            num[i]=tmp;
        }
    }
    void solve(){
        if(!m){cout<<endl;return;}
        dfs(0,m);
    }
    int main() {
        init();
        solve();
        return 0;
    }
    View Code
  • 相关阅读:
    VS2010 error LNK2019: 无法解析的外部符号
    strspn()函数的使用方法
    直接插入排序
    opecv 常用的函数
    matlab中 fprintf 和disp的用法
    面试经历
    挚爱 泰戈尔
    见与不见
    无题
    Cannot create PoolableConnectionFactory (Could not create connection to database server.
  • 原文地址:https://www.cnblogs.com/Rhythm-/p/9318174.html
Copyright © 2011-2022 走看看