從 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...