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
思路:
全排列+保持升序選擇(只需保證新加的數,大於前一個數)
class
#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; }