實現指數型列舉的普遍方法

2021-10-05 23:47:53 字數 1439 閱讀 6387

題目描述:

從 1~n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。

輸入格式

輸入乙個整數n。

輸出格式

每行輸出一種方案。

同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。

對於沒有選任何數的方案,輸出空行。

本題有自定義校驗器(spj),各行(不同方案)之間的順序任意。

資料範圍

1≤n≤15

輸入樣例:

輸出樣例:32

2 31

1 31 2

1 2 3

方法一:遞迴+位運算

思路:二進位制都是0與1,用位運算正好可以標記每乙個數是否被選擇,並且不會占用太多空間。

時間複雜度估算:o(n^2)

#include

#include

#include

#include

using

namespace std;

int n;

//遞迴+位運算

void

dfs(

int u,

int state)

dfs(u +

1, state)

;//第u位沒有被選

dfs(u +

1, state |(1

<< u));

//第u位被選了

}int

main()

方法二:純遞迴

思路:將同乙個數分成「選」與「不選」兩條分支。每一次沿著分支走,未確定的數就減少1,規模更小。

#include

#include

#include

#include

using

namespace std;

int n;

vector<

int> v;

void

dfs(

int u)

//u沒被選擇

dfs(u +1)

;//u被選擇

v.push_back

(u);

dfs(u +1)

;//還原現場

v.pop_back()

;}intmain()

方法三:純位運算

思路:進行一次迴圈列舉所有選擇方案。應注意的是,二進位制應逆序,否則得不到答案。

時間複雜度估算:o(n * 2^n)

#include

#include

#include

#include

using

namespace std;

int n;

intmain()

return0;

}

遞迴實現指數型列舉

從 1 n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。輸入格式 輸入乙個整數 n。輸出格式 每行輸出一種方案。同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。對於沒有選任何數的方案,輸出空行。本題有自定義校驗器 spj 各行 不同方案 之間的順序任意。資料範圍1 n 15 ...

遞迴實現指數型列舉

從 1 n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。輸入乙個整數n。每行輸出一種方案。同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。對於沒有選任何數的方案,輸出空行。本題有自定義校驗器 spj 各行 不同方案 之間的順序任意。1 n 15 1 n 15 1 n 15 3...

遞迴實現指數型列舉

從 1 n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。輸入格式 輸入乙個整數n。輸出格式 每行輸出一種方案。同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。對於沒有選任何數的方案,輸出空行。本題有自定義校驗器 spj 各行 不同方案 之間的順序任意。資料範圍 1 n 15 ...