遞迴實現指數型列舉
阿新 • • 發佈:2020-08-23
題目描述
從 1~n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。
輸入格式
輸入一個整數n。
輸出格式
每行輸出一種方案。
同一行內的數必須升序排列,相鄰兩個數用恰好1個空格隔開。
對於沒有選任何數的方案,輸出空行。
本題有自定義校驗器(SPJ),各行(不同方案)之間的順序任意。
資料範圍
1\(\leq\)n \(\leq\) 15
輸入樣例
3
輸出樣例
3
2
2 3
1
1 3
1 2
1 2 3
演算法1
1~n這n個數字每個數字都有輸出與不輸出兩種選擇。所以所有的輸出方案共有\(2^n\)種。
我們可以考慮使用狀態壓縮的非遞迴做法。
狀態壓縮的特性:可以列舉所有選與不選的情況。
可以用state的二進位制表示形式中每位上的0/1
eg:
當n=3時,共有8中輸出方案。
state=0 ——> 000 ——>一個數字也不輸出
state=1 ——> 001 ——>輸出數字1
state=2 ——> 010 ——>輸出數字2
state=3 ——> 011 ——>輸出數字1 2
state=4 ——> 100 ——>輸出數字3
state=5 ——> 101 ——>輸出數字1 3
state=6 ——> 110 ——>輸出數字2 3
state=7 ——> 111 ——>輸出數字1 2 3
C++ 程式碼
#include<iostream> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; for(int state=0;state<(1<<n);state++) { for(int j=0;j<n;j++) { if(state>>j&1) cout<<j+1<<" "; } cout<<endl; } return 0; }
演算法2
(非遞迴暴力列舉) \(O(n^2)\)
blablabla
時間複雜度
參考文獻
C++ 程式碼
blablabla