Acwing 92.遞迴實現指數型列舉
阿新 • • 發佈:2021-11-09
連結:https://www.acwing.com/problem/content/94/
題目
從 1∼n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。
輸入格式
輸入一個整數 n。
輸出格式
每行輸出一種方案。
同一行內的數必須升序排列,相鄰兩個數用恰好 1 個空格隔開。
對於沒有選任何數的方案,輸出空行。
本題有自定義校驗器(SPJ),各行(不同方案)之間的順序任意。
資料範圍
1≤n≤15
輸入樣例:
3
輸出樣例:
3
2
2 3
1
1 3
1 2
1 2 3
思路:
對於整數n,從1到n,每個數都有選或者不選兩種可能,所以總共的方案數=2^n
可以建立一個數組,保留每一位的選擇,1表示選這個數,2表示不選這個數
題解
#include<bits/stdc++.h> using namespace std; const int N=16; int n; int ans[N]; //保留結果的陣列,0表示未選擇,1表示選這個數,2表示不選這個數 void dfs(int u) { if(u>n) { for(int i=1;i<=n;i++) if(ans[i]==1) cout<<i<<' '; cout<<endl; return ; } ans[u]=1; //第一個分支,選它 dfs(u+1); ans[u]=0; //恢復現場 ans[u]=2; //第二個分支,不選它 dfs(u+1); ans[u]=0; //恢復現場 } int main() { cin>>n; dfs(1); return 0; }