CH 0302遞迴 非遞迴實現組合型列舉

2021-09-18 06:57:52 字數 1816 閱讀 7389

描述

從 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位置的數字進...