遞歸實現組合型枚舉

遞歸實現組合型枚舉

問題

從 1~n 這 n 個整數中隨機選出 m 個,輸出全部可能的選擇方案。spa

輸入格式

兩個整數n,m在同一行用空格隔開。code

輸出格式

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

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

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

數據範圍

n>0,
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

遞歸示意圖

US(X39MP0HB8P8LE6_1Z5SH.png

代碼

#include <cstdio>

const int N = 30;

int way[N];
int n, m;

void dfs(int u, int start)    //u:表示枚舉位置,start:表示枚舉位置的值的最小值 
{
    if (u + n - start < m ) return;        //剪枝 
    if ( u == m + 1)
    {
        for (int i = 1; i <= m; i ++)
            printf("%d ", way[i]);
        printf("\n");
        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;
}
相關文章
相關標籤/搜索