1. 程式人生 > 實用技巧 >遞迴實現指數型列舉

遞迴實現指數型列舉

題目描述

從 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