非遞迴解決組合問題

2021-09-30 02:27:41 字數 2385 閱讀 4190

從m 個互不相同元素中取 n 個元素,一般選用遞迴或回溯演算法解決,本文旨在利用進製轉換的方法達到這一目的。**如下

sub getall(byval num as integer, byref x as variant, byref result() as string, optional byref all as long)

dim a() as string, b() as integer '臨時陣列

dim n as integer ' 陣列元素個數

dim i as long '迴圈變數

dim temp as long '二進位制轉換中間變數

dim num2 as integer '中間計數變數

n = ubound(x) - lbound(x) + 1 '陣列元素個數

if num > n then msgbox "err!", vbinformation, "warning": exit sub

redim b(0 to n - 1)

all = 0

for i = 0 to 2 ^ n - 1 '迴圈

temp = i

num2 = 0

for j = 0 to n - 1 '轉換為二進位制

b(j) = temp and 1 '0 or 1

temp = temp / 2

if b(j) = 1 then

num2 = num2 + 1

redim preserve a(1 to num2)

a(num2) = x(lbound(x) + j)

end if

next

if num2 = num then

all = all + 1

redim preserve result(1 to all)

result(all) = join(a, ",")   '結果儲存

debug.print result(all) '輸出

end if

next

debug.print "從 " & n & " 個元素的陣列中選 " & num; " 個元素, 共 " & all & "種組合!"

end sub

private sub command1_click()

dim x, i as integer

dim out() as string

x = array(1, 2, 3, 4, 5, 6, 7, 8)

getall 4, x, out

end sub

輸出:1,2,3,4

1,2,3,5

1,2,4,5

1,3,4,5

2,3,4,5

1,2,3,6

1,2,4,6

1,3,4,6

2,3,4,6

1,2,5,6

1,3,5,6

2,3,5,6

1,4,5,6

2,4,5,6

3,4,5,6

1,2,3,7

1,2,4,7

1,3,4,7

2,3,4,7

1,2,5,7

1,3,5,7

2,3,5,7

1,4,5,7

2,4,5,7

3,4,5,7

1,2,6,7

1,3,6,7

2,3,6,7

1,4,6,7

2,4,6,7

3,4,6,7

1,5,6,7

2,5,6,7

3,5,6,7

4,5,6,7

1,2,3,8

1,2,4,8

1,3,4,8

2,3,4,8

1,2,5,8

1,3,5,8

2,3,5,8

1,4,5,8

2,4,5,8

3,4,5,8

1,2,6,8

1,3,6,8

2,3,6,8

1,4,6,8

2,4,6,8

3,4,6,8

1,5,6,8

2,5,6,8

3,5,6,8

4,5,6,8

1,2,7,8

1,3,7,8

2,3,7,8

1,4,7,8

2,4,7,8

3,4,7,8

1,5,7,8

2,5,7,8

3,5,7,8

4,5,7,8

1,6,7,8

2,6,7,8

3,6,7,8

4,6,7,8

5,6,7,8

從 8 個元素的陣列中選 4 個元素, 共 70種組合!

但從運算速度上來說,本方法可能要比遞迴,回溯慢些。

遞迴解決排列組合問題

排列組合是組合學最基本的概念。所謂排列,就是指從給定個數的元素中取出指定個數的元素進行排序。組合則是指從給定個數的元素中僅僅取出指定個數的元素,不考慮排序。詳細定義參考 在各種演算法比賽,或面試題中經常會出現關於排列組合的演算法題,這裡總結幾種典型解法來給大家參考 如果是簡單的排列計數問題可以通過數...

非遞迴 求所有組合

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

python 非遞迴解決n皇后問題

python 非遞迴解決n皇后問題 複雜度可能高了點 也沒太注意 我想了好久 也找了好久 沒看到什麼能夠用python解決n皇后問題而且不呼叫遞迴的 因為我不太能理解遞迴 尤其是到n層時 智商受限 import copy defcheck a,x,y b flag true for i in ran...