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