算法競賽-遞歸(三)

acwing:93. 遞歸實現組合型枚舉
從 1~n 這 n 個整數中隨機選出 m 個,輸出全部可能的選擇方案。ios

輸入格式

兩個整數 n,mspa

,在同一行用空格隔開。code

輸出格式

按照從小到大的順序輸出全部方案,每行1個。blog

首先,同一行內的數升序排列,相鄰兩個數用一個空格隔開。遞歸

其次,對於兩個不一樣的行,對應下標的數一一比較,字典序較小的排在前面(例如1 3 5 7排在1 3 6 8前面)。string

數據範圍

n>0it

,
0≤m≤n ,
n+(n−m)≤25io

輸入樣例:

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

思路:
全排列+保持升序選擇(只需保證新加的數,大於前一個數)
2.PNGclass

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=30;
int n,m;
int way[N];
void dfs(int u,int start)
{
    if(u+n-start<m) return;//剪枝 (當前正在選第u個數:u-1+n-start+1<m)
    if(u==m+1){
    
    for(int i=1;i<=m;i++)
        printf("%d ",way[i]);
        puts(" ");
        return;
    }
    for(int i=start;i<=n;i++)//枚舉 
    {
        way[u]=i;
        dfs(u+1,i+1);
        way[u]=0;
    }
}
int main() 
{scanf("%d%d",&n,&m);
dfs(1,1);
return 0;
}
相關文章
相關標籤/搜索