演算法競賽高階指南 遞迴實現指數型列舉

2021-09-09 08:40:07 字數 2487 閱讀 7222

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

輸入乙個整數n。

每行輸出一種方案。

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

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

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

1≤n≤15

3
3

22 3

11 3

1 21 2 3

填坑,從填1個坑到填n個坑。

坑可以隨便填,比如第1個坑選了2之後,第2個坑可以填1(非公升序),也可以填3(公升序)

#include

using namespace std;

typedef

long

long ll;

int n;

int a[20]

;bool vis[20]

;// 一共tar個坑,當前列舉到第pos個坑

void

dfs(

int pos,

int tar)

// 選數填坑,選擇的數範圍是1~n

for(

int i =

1; i <= n; i ++)}

}int

main()

依舊是填坑,從填1個坑到填n個坑。

和上面不同的是,上面是第1個坑選了2之後,第2個坑還可以從2之前的數開始填坑,現在是第1個坑選了2之後,第2個坑只能從大於2的數里選了。

即,當前的坑pos處填了num,則填下乙個坑pos+1時,只能從大於num的數里選擇填坑。

解決辦法:dfs裡加乙個start,選數的時候,只能從start之後的數裡面選擇

#include

using namespace std;

int n;

int a[20]

;bool vis[20]

;// 當前列舉到第pos個坑, 上乙個坑填的是start-1,這次只能從start開始找數填, 一共要填tar個坑

void

dfs(

int pos,

int start,

int tar)

// 選數填坑,選擇的數範圍是start~n

for(

int i = start; i <= n; i ++)}

}int

main()

用乙個二進位制數表示選了哪些數,替代之前的a[20]陣列

其中 state |= 1 << (i - 1) 代表狀態的改變,選了i這個數

state ^= 1 << (i - 1) 代表狀態的還原,還原沒選i這個數的狀態

#include

using namespace std;

int n;

bool vis[20]

;void

dfs(

int pos,

int start,

int tar,

int state)

cout << endl;

return;}

for(

int i = start; i <= n; i ++)}

}int

main()

狀態壓縮的特性:可以列舉所有選與不選的情況

題目要求的結果是2^n個

這2^n個選擇情況,對應於乙個n位的2進製數的各個位取0或取1的情況

例中n=3,即

000 -> \n

001 -> 1

010 -> 2

100 -> 3

011 -> 1 2

101 -> 1 3

110 -> 2 3

111 -> 1 2 3

#include

using namespace std;

intmain()

cout << endl;

}return0;

}

#include

using namespace std;

typedef

long

long ll;

int n;

// pos是當前列舉到的位置,state是二進位制數記錄哪些數被選

void

dfs(

int pos,

int state)

dfs (pos +

1, state)

;// 不用位於pos這個數

dfs (pos +

1, state +(1

<< pos));

// 用位於pos這個數

}int

main()

遞推實現指數型列舉 演算法競賽高階指南

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

演算法競賽高階指南 遞迴實現排列型列舉

把 1 n 這 n 個整數排成一行後隨機打亂順序,輸出所有可能的次序。輸入格式 乙個整數n。輸出格式 按照從小到大的順序輸出所有方案,每行1個。首先,同一行相鄰兩個數用乙個空格隔開。其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面。資料範圍 1 n 9 輸入樣例 3輸出樣例 1 2...

遞迴實現組合型列舉 演算法競賽高階指南

從 1 n 這 n 個整數中隨機選出 m 個,輸出所有可能的選擇方案。輸入格式 兩個整數 n,m 在同一行用空格隔開。輸出格式 按照從小到大的順序輸出所有方案,每行1個。首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面 例如1...