題目描述:
從 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 ...