原題連接ios
從 1~n 這 n 個整數中隨機選出 m 個,輸出全部可能的選擇方案。c++
兩個整數 n,m ,在同一行用空格隔開。數組
按照從小到大的順序輸出全部方案,每行1個。優化
首先,同一行內的數升序排列,相鄰兩個數用一個空格隔開。spa
其次,對於兩個不一樣的行,對應下標的數一一比較,字典序較小的排在前面(例如1 3 5 7排在1 3 6 8前面)。code
n>0 ,
0≤m≤n ,
n+(n−m)≤25遞歸
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
思考題:若是要求使用非遞歸方法,該怎麼作呢?ci
仍然是遞歸搜索樹,枚舉方案爲:依次枚舉每一個位置上的數是幾;get
本題又用到剪枝來對代碼進行了優化,若是發現某方案無解,則能夠提早退出。string
dfs參數中:
1.表示m個位置,開一個數組存儲env[N];
2.loc表示當前枚舉到了哪一個位置;
3.sma當前最小能夠從哪一個數枚舉 。
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int N = 29; int n,m; int env[N]; void dfs(int loc,int sma)//當前枚舉到了哪一個位置、當前最小能夠從哪一個數枚舉 { //剪枝 if(loc+n-sma<m) return;//已經選了loc-1個數 假設把sma到n所有選上(n-sma+1)也不夠m個數(<m) if(loc==m+1)//表示枚舉結束 { for(int i=1;i<=m;i++) cout<<env[i]<<' '; cout<<endl; return; } for(int i=sma;i<=n;i++) { env[loc]=i; dfs(loc+1,i+1); env[loc]=0; } } int main() { cin>>n>>m; dfs(1,1);//初始從第1個位置開始枚舉、最小能夠枚舉的數爲1 return 0; }