排列與組合是經常使用的數學方法,其中組合就是從n個元素中抽出r個元素(不分順序且r≤n),咱們能夠簡單地將n個元素理解爲天然數1,2,…,n,從中任取r個數。ios
現要求你用遞歸的方法輸出全部組合。ide
例如n=5,r=3,全部組合爲:spa
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 53d
一行兩個天然數n、r(1<n<21,1≤r≤n)。code
全部的組合,每個組合佔一行且其中的元素按由小到大的順序排列,每一個元素佔三個字符的位置,全部的組合也按字典順序。blog
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
全排列變形,判斷條件要增長一個:後一個數大於前一個數;遞歸
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n, r, st[1010]; 5 bool book[1010]; 6 void dfs(int u){ 7 if(u == r + 1){ 8 9 for(int i = 1; i <= r; i++) printf("%3d", st[i]); 10 printf("\n"); 11 } 12 13 for(int i = 1; i <= n; i++){ 14 if(!book[i] && st[u - 1] < i){ 15 st[u] = i; 16 book[i] = true; 17 dfs(u + 1); 18 book[i] = false; 19 } 20 } 21 22 23 } 24 int main(){ 25 scanf("%d %d", &n, &r); 26 dfs(1); 27 return 0; 28 }