描述
從 1~n 這 n 個整數中隨機選出 m 個,輸出所有可能的選擇方案。n>0, 0<=m<=n, n+(n-m)<=25。
輸入格式
兩個整數n,m。
輸出格式
按照從小到大的順序輸出所有方案**,**每行1個。
首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面(例如1 3 9 12排在1 3 10 11前面)。
樣例輸入
5 3
樣例輸出1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
在指數型列舉上加乙個剪枝就可以了,指數型回顧,就不在每種都分析一遍了,直接上**
普通的遞迴是超時的,新進數時不能在迴圈找了,直接用上一次賦值後的值加一
書中寫法
#include
#include
using namespace std;
static
const
auto io_sync_off =
()()
;int n, m;
vector<
int> nums;
void
infer
(int cur)
nums.
push_back
(cur)
;infer
(cur +1)
; nums.
pop_back()
;infer
(cur +1)
;}intmain()
狀態壓縮遞迴#include
#include
using namespace std;
static
const
auto io_sync_off =
()()
;int n, m;
void
dfs(
int cur,
int num,
int step)
for(
int i = cur; i < n;
++i)
dfs(i +
1, num |
1<< i, step +1)
;}intmain()
其實這種方法和上面是一樣的
#include
#include
using namespace std;
static
const
auto io_sync_off =
()()
;int n, m;
void
dfs(
int cur,
int step,
int num)
if(cur == n)
return
;//到底之後返回,這裡不返回會回溯到不是m個數的狀態
dfs(cur +
1, step+
1, num |
1<< cur)
;dfs
(cur +
1, step, num)
;// 不選的話,步數不用加1
}int
main()
CH0302 遞迴 非遞迴實現組合型列舉
描述 從 1 n 這 n 個整數中隨機選出 m 個,輸出所有可能的選擇方案。n 0,0 m n,n n m 25。輸入格式 兩個整數n,m。輸出格式 按照從小到大的順序輸出所有方案,每行1個。首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。其次,對於兩個不同的行,對應下標的數一一比較,字典序...
非遞迴解決組合問題
從m 個互不相同元素中取 n 個元素,一般選用遞迴或回溯演算法解決,本文旨在利用進製轉換的方法達到這一目的。如下 sub getall byval num as integer,byref x as variant,byref result as string,optional byref all ...
非遞迴 求所有組合
從 0,nn 1 這nn個數裡面,找到所有組合 例如con 5,3 0 1 2 0 1 3 0 1 4 0 2 3 0 2 4 0 3 4 1 2 3 1 2 4 1 3 4 2 3 4 類似於加法器,初始是0,1,2 每次給最後的乙個數字加一 令kmax 3,k在 0,kmax 則第k位置的數字進...