遍历组合的实现——VB2005

前端之家收集整理的这篇文章主要介绍了遍历组合的实现——VB2005前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在数学的统计分支里,排列与组合是一个很重要的分支。在各种实际应用中,排列与组合也扮演了重要的角色。举例来说,安排人员参加活动可以看作是组合的应用。比方说,现在有十个人,选出其中的五个人参加某项集体活动。由于彼此之间有着脾气性格等因素,所以,不同的人员组合有着不同的工作效率。现在,要求你找出效率最高的人员安排。因为选出五人参加活动,没有顺序问题,因此是一个组合的问题。如果说,随机的选出一个组合,用计算机来实现是非常简单的,常见的“洗牌算法”就能实现。要找出效率最高的组合,只要遍历所有的组合即可。问题是如何遍历所有的组合。

还是利用数学知识,我们知道组合函数Cm,n)代表着从n个人选m个人的组合的可能数。那么5,10=252就表示本题有252种选择。如果,给每一种组合都标上标号,不同的标号代表不同的组合,这样遍历所有的组合就转化为遍历标号了。

基于这个思想,完成下面的代码。其中,主函数有两个。

一个是

Public @H_502_64@Shared @H_502_64@Function C(@H_502_64@ByVal C1 @H_502_64@As @H_502_64@Integer,_

@H_502_64@ByVal C2 @H_502_64@As @H_502_64@Integer) @H_502_64@As @H_502_64@Integer

用来计算组合数的,C1是上标,C2是下标。

另一个是

@H_502_64@Shared @H_502_64@Function GetCombination( _

ByVal Lower @H_502_64@As @H_502_64@Integer,_

Upper @H_502_64@As @H_502_64@Integer,"sans-serif"; mso-font-kerning: 0pt; mso-no-proof: yes; mso-fareast-font-family: 新宋体;" lang="EN-US"> Count @H_502_64@As @H_502_64@Integer,"sans-serif"; mso-font-kerning: 0pt; mso-no-proof: yes; mso-fareast-font-family: 新宋体;" lang="EN-US"> Index @H_502_64@As @H_502_64@Integer) @H_502_64@As @H_502_64@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,I)

DoSomeWork 执行根据组合计算效率的代码

Next

这样,就遍历了所有的组合

代码赋予其后,用的是VB2005

@H_502_64@Class clsCombination

Index @H_502_64@As @H_502_64@Integer) @H_502_64@As @H_502_64@Integer()

@H_502_64@If Count > Upper - Lower + 1 @H_502_64@Then @H_502_64@Return @H_502_64@Nothing

@H_502_64@If Count <= 0 @H_502_64@Then @H_502_64@Return @H_502_64@Nothing

@H_502_64@If Lower > Upper @H_502_64@Then @H_502_64@Return @H_502_64@Nothing

@H_502_64@If Lower < 0 @H_502_64@OrElse Upper < 0 @H_502_64@Then @H_502_64@Return @H_502_64@Nothing

@H_502_64@Dim tS() @H_502_64@As @H_502_64@String = GetC(Lower,Upper,Count,Index) _

.Split(",".tocharArray,_

StringSplitOptions.RemoveEmptyEntries)

@H_502_64@Dim tI() @H_502_64@As @H_502_64@Integer

@H_502_64@ReDim tI(tS.GetUpperBound(0))

@H_502_64@Dim i @H_502_64@As @H_502_64@Integer

@H_502_64@For i = 0 @H_502_64@To tI.GetUpperBound(0)

tI(i) = tS(i)

@H_502_64@Next

@H_502_64@Return tI

@H_502_64@End @H_502_64@Function

Private @H_502_64@Shared @H_502_64@Function GetC(@H_502_64@ByVal Lower @H_502_64@As @H_502_64@Integer,"sans-serif"; mso-font-kerning: 0pt; mso-no-proof: yes; mso-fareast-font-family: 新宋体;" lang="EN-US"> Index @H_502_64@As @H_502_64@Integer) @H_502_64@As @H_502_64@String

Dim i @H_502_64@As @H_502_64@Integer,tS @H_502_64@As @H_502_64@String

@H_502_64@If Count = Upper - Lower + 1 @H_502_64@Then

tS = ""

@H_502_64@For i = Lower @H_502_64@To Upper

tS &= i & ","

@H_502_64@Next

@H_502_64@Return tS

@H_502_64@End @H_502_64@If

Index = Index @H_502_64@Mod C(Count,Upper - Lower + 1)

i = C(Count - 1,Upper - Lower)

@H_502_64@If Index < i @H_502_64@Then

tS = Lower & "," & _

GetC(Lower + 1,Count - 1,Index)

@H_502_64@Else

tS = GetC(Lower + 1,Index - i)

@H_502_64@ByVal C2 @H_502_64@As @H_502_64@Integer) @H_502_64@As @H_502_64@Integer

@H_502_64@If C1 < 0 @H_502_64@OrElse C1 > C2 @H_502_64@OrElse C2 <= 0 @H_502_64@Then @H_502_64@Return 0

@H_502_64@If C1 = 0 @H_502_64@Then @H_502_64@Return 1

@H_502_64@Dim i @H_502_64@As @H_502_64@Integer,S1 @H_502_64@As @H_502_64@Single = 1

@H_502_64@For i = 1 @H_502_64@To C1

S1 *= (C2 - i + 1) / i

@H_502_64@Return S1

@H_502_64@End @H_502_64@Function

End @H_502_64@Class

猜你在找的VB相关文章