给你个低速算法Option ExplicitDim m_lRangeCount As Long Dim m_lCount As Long Dim m_alDest() As Long Dim m_alRange() As Long Dim m_lSum As Long Private Sub Form_Load() Dim aSort() As Long
m_lCount = 5 ReDim aSort(1 To m_lCount, 1 To 2) As Long ReDim m_alDest(1 To m_lCount) m_alDest(1) = 1 m_alDest(2) = 3 m_alDest(3) = 5 m_alDest(4) = 2 m_alDest(5) = 6
m_lSum = 9
Call go(aSort()) End SubSub go(aSortArray() As Long, Optional lIndex As Long = -1) Dim lLB As Long, lUB As Long Dim N As Long Dim i As Long, t As Long lLB = LBound(aSortArray) lUB = UBound(aSortArray) N = lUB - lLB + 1
If lIndex = N + 1 Then test aSortArray() Else lIndex = IIf(lIndex = -1, 1, lIndex) For i = 1 To N If aSortArray(i, 2) <> 1 Then aSortArray(lIndex, 1) = i aSortArray(i, 2) = 1 Call go(aSortArray(), lIndex + 1) aSortArray(i, 2) = 0 End If Next End If End Sub Sub test(aSortArray() As Long) Dim i As Long, j As Long Dim s As String Dim lTmp As Long For j = LBound(m_alRange) To UBound(m_alRange) lTmp = 0 For i = 1 To m_alRange(j) lTmp = lTmp + m_alDest(aSortArray(i, 1)) Next If lTmp = m_lSum Then s = "" For i = LBound(aSortArray) To UBound(aSortArray) s = s & CStr(aSortArray(i, 1)) & " " Next
s = "范围1-" & CStr(m_alRange(j)) & ":" & s '输出到列表 List1.AddItem s End If Next End Sub
用一个i记录次数。当访问到3或者4的时候就知道i的值,然后就用个for语句就解决了。
Dim m_lCount As Long
Dim m_alDest() As Long
Dim m_alRange() As Long
Dim m_lSum As Long
Private Sub Form_Load()
Dim aSort() As Long
m_lRangeCount = 2
ReDim m_alRange(m_lRangeCount - 1)
m_alRange(0) = 3
m_alRange(1) = 4
m_lCount = 5
ReDim aSort(1 To m_lCount, 1 To 2) As Long
ReDim m_alDest(1 To m_lCount)
m_alDest(1) = 1
m_alDest(2) = 3
m_alDest(3) = 5
m_alDest(4) = 2
m_alDest(5) = 6
m_lSum = 9
Call go(aSort())
End SubSub go(aSortArray() As Long, Optional lIndex As Long = -1)
Dim lLB As Long, lUB As Long
Dim N As Long
Dim i As Long, t As Long
lLB = LBound(aSortArray)
lUB = UBound(aSortArray)
N = lUB - lLB + 1
If lIndex = N + 1 Then
test aSortArray()
Else
lIndex = IIf(lIndex = -1, 1, lIndex)
For i = 1 To N
If aSortArray(i, 2) <> 1 Then
aSortArray(lIndex, 1) = i
aSortArray(i, 2) = 1
Call go(aSortArray(), lIndex + 1)
aSortArray(i, 2) = 0
End If
Next
End If
End Sub
Sub test(aSortArray() As Long)
Dim i As Long, j As Long
Dim s As String
Dim lTmp As Long
For j = LBound(m_alRange) To UBound(m_alRange)
lTmp = 0
For i = 1 To m_alRange(j)
lTmp = lTmp + m_alDest(aSortArray(i, 1))
Next
If lTmp = m_lSum Then
s = ""
For i = LBound(aSortArray) To UBound(aSortArray)
s = s & CStr(aSortArray(i, 1)) & " "
Next
s = "范围1-" & CStr(m_alRange(j)) & ":" & s
'输出到列表
List1.AddItem s
End If
Next
End Sub