位置于:首页>>编程开发>>Asp.net教程>>正文
 非递归解决组合问题

从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 SubReDim b(0 To n - 1)all = 0For i = 0 To 2 ^ n - 1 '循环TEMP = inum2 = 0For j = 0 To n - 1 '转换为二进制b(j) = TEMP And 1 '0 or 1TEMP = TEMP \ 2If b(j) = 1 Thennum2 = num2 + 1ReDim Preserve A(1 To num2)A(num2) = x(LBound(x) + j)End IfNextIf num2 = num Thenall = all + 1ReDim Preserve RESULT(1 To all)RESULT(all) = Join(A, ",")   '结果保存Debug.Print RESULT(all) '输出End IfNextDebug.Print "从 " & n & " 个元素的数组中选 " & num; " 个元素, 共 " & all & "种组合!"End Sub

Private Sub Command1_Click()Dim x, i As IntegerDim out() As Stringx = Array(1, 2, 3, 4, 5, 6, 7, 8)GETALL 4, x, outEnd Sub

输出:

1,2,3,41,2,3,51,2,4,51,3,4,52,3,4,51,2,3,61,2,4,61,3,4,62,3,4,61,2,5,61,3,5,62,3,5,61,4,5,62,4,5,63,4,5,61,2,3,71,2,4,71,3,4,72,3,4,71,2,5,71,3,5,72,3,5,71,4,5,72,4,5,73,4,5,71,2,6,71,3,6,72,3,6,71,4,6,72,4,6,73,4,6,71,5,6,72,5,6,73,5,6,74,5,6,71,2,3,81,2,4,81,3,4,82,3,4,81,2,5,81,3,5,82,3,5,81,4,5,82,4,5,83,4,5,81,2,6,81,3,6,82,3,6,81,4,6,82,4,6,83,4,6,81,5,6,82,5,6,83,5,6,84,5,6,81,2,7,81,3,7,82,3,7,81,4,7,82,4,7,83,4,7,81,5,7,82,5,7,83,5,7,84,5,7,81,6,7,82,6,7,83,6,7,84,6,7,85,6,7,8从 8 个元素的数组中选 4 个元素, 共 70种组合!

但从运算速度上来说,本方法可能要比递归,回溯慢些。

内部:http://xp163.com/
 非递归解决组合问题站内说明
 最新站点内更新

 

 书籍教程站内推荐信息
 书籍教程网站地图