在數學的統計分支裡,排列與組合是乙個很重要的分支。在各種實際應用中,排列與組合也扮演了重要的角色。舉例來說,安排人員參加活動可以看作是組合的應用。比方說,現在有十個人,選出其中的五個人參加某項集體活動。由於彼此之間有著脾氣性格等因素,所以,不同的人員組合有著不同的工作效率。現在,要求你找出效率最高的人員安排。因為選出五人參加活動,沒有順序問題,因此是乙個組合的問題。如果說,隨機的選出乙個組合,用計算機來實現是非常簡單的,常見的"洗牌演算法"就能實現。要找出效率最高的組合,只要遍歷所有的組合即可。問題是如何遍歷所有的組合。
還是利用數學知識,我們知道組合函式c(m,n)代表著從n個人選m個人的組合的可能數。那麼c(5,10)=252就表示本題有252種選擇。如果,給每一種組合都標上標號,不同的標號代表不同的組合,這樣遍歷所有的組合就轉化為遍歷標號了。
基於這個思想,完成下面的**。其中,主函式有兩個。
乙個是
public shared function c(byval c1 as integer, byval c2 as integer) as integer
用來計算組合數的,c1是上標,c2是下標。
另乙個是
public shared function getcombination( byval lower as integer, byval upper as integer, byval count as integer, byval index as integer) as integer()
這是根據引數返回乙個組合,
lower表示返回組合的下限
upper表示返回組合的上限
count表示組合中的元素數
index表示該組合的標號
要獲得乙個組合,直接呼叫即可。如:
dim t() as integer
t= getcombination(1,10,5,20)
這個表示返回本題的乙個組合,其中20是標號
如果想隨機得到乙個組合,只要給乙個隨機的標號即可
要遍歷組合,設定引數i即可。如:
dim t() as integer,i as integer
for i=1 to c(5,10)
t=getcombination(1,10,5,i)
dosomework
執行根據組合計算效率的**
next
這樣,就遍歷了所有的組合
**賦予其後,用的是vb2005(**格式修正於2023年1月5日)
public
class clscombination
public
shared
function getcombination(byval lower as
integer, byval upper as
integer, byval count as
integer, byval index as
integer) as
integer()
if count > upper - lower + 1 then
return
nothing
if count <= 0 then
return
nothing
if lower > upper then
return
nothing
if lower < 0 orelse upper < 0 then
return
nothing
dim ts() as
string = getc(lower, upper, count, index).split(",".tochararray, stringsplitoptions.removeemptyentries)
dim ti() as
integer
redim ti(ts.getupperbound(0))
dim i as
integer
for i = 0 to ti.getupperbound(0)
ti(i) = ts(i)
next
return ti
endfunction
private
shared
function getc(byval lower as
integer, byval upper as
integer, byval count as
integer, byval index as
integer) as
string
dim i as
integer, ts as
string
if count = upper - lower + 1 then
ts = ""
for i = lower to upper
ts &= i & ","
next
return ts
endif
index = index mod c(count, upper - lower + 1)
i = c(count - 1, upper - lower)
if index < i then
ts = lower & "," & getc(lower + 1, upper, count - 1, index)
else
ts = getc(lower + 1, upper, count, index - i)
endif
return ts
endfunction
public
shared
function c(byval c1 as
integer, byval c2 as
integer) as
integer
if c1 < 0 orelse c1 > c2 orelse c2 <= 0 then
return 0
if c1 = 0 then
return 1
dim i as
integer, s1 as
single = 1
for i = 1 to c1
s1 *= (c2 - i + 1) / i
next
return s1
endfunction
endclass
遍歷組合的實現 VB2005
在數學的統計分支裡,排列與組合是乙個很重要的分支。在各種實際應用中,排列與組合也扮演了重要的角色。舉例來說,安排人員參加活動可以看作是組合的應用。比方說,現在有十個人,選出其中的五個人參加某項集體活動。由於彼此之間有著脾氣性格等因素,所以,不同的人員組合有著不同的工作效率。現在,要求你找出效率最高的...
遍歷組合的實現 VB2005
在數學的統計分支裡,排列與組合是乙個很重要的分支。在各種實際應用中,排列與組合也扮演了重要的角色。舉例來說,安排人員參加活動可以看作是組合的應用。比方說,現在有十個人,選出其中的五個人參加某項集體活動。由於彼此之間有著脾氣性格等因素,所以,不同的人員組合有著不同的工作效率。現在,要求你找出效率最高的...
隨機雜湊的實現(VB2005)
編寫過程式的人都知道,隨機雜湊是我們經常要實現的問題。什麼是隨機雜湊?比方說,現在有乙個數列1 2 3 4 5 6。我希望得到乙個隨機的打亂順序的數列,例如 2,5,6,3,4,1。這個新的數列就是原數列的隨機雜湊。實際情況中,我們經常需要給定乙個範圍,就能得到乙個隨機雜湊。比方說 給定 2,7 通...