P1157 組合的輸出
阿新 • • 發佈:2022-02-27
目錄
題目描述
題目描述
排列與組合是常用的數學方法,其中組合就是從n個元素中抽出rr個元素(不分順序且r \le n)r≤n),我們可以簡單地將n個元素理解為自然數1,2,…,n,從中任取rr個數。
現要求你輸出所有組合。
例如n=5,r=3,所有組合為:
12 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
輸入格式
一行兩個自然數\(n,r(1<n<21,0 \le r \le n)\)
。輸出格式
所有的組合,每一個組合佔一行且其中的元素按由小到大的順序排列,每個元素佔三個字元的位置,所有的組合也按字典順序。
**注意哦!輸出時,每個數字需要33個場寬,pascal可以這樣:
write(ans:3);
輸入輸出樣例
輸入 #1複製
5 3
輸出 #1複製
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
dfs演算法求解
分析
程式碼
#include<iostream> #include<cstdio> using namespace std; int n, r; int res[100]; // 搜尋第k個數 void dfs(int k) { if(k > r) { for(int i= 1; i <= r; i++) printf("%3d", res[i]); puts(""); return; } // 從上一個數緊接著往後搜 for(int i = res[k-1]+1; i <= n; i++) { res[k] = i; dfs(k+1); } } int main() { scanf("%d%d", &n, &r); dfs(1); return 0; }