Private Sub Command1_Click()
Dim S() As String
GETALL "1,11,20,22,22,23,25,45,68,92,111,356", 45, S '和为19 时
End Sub
我想在运行的界面里输入数字
就是输入一个数字 接着输下一个数字 ,直到输完
-----------------------------------------------
Private Sub Command1_Click()
Dim x As String
x = InputBox("please enter numbers splitted by "",""", "INFORMATION", "11,12,13,14,15,16,17")
Dim S() As String
GETALL x, 45, S '和为45 时
End Sub
大概如下,再改改。
dim pFile as string
pfile="1,11,20,22,22,23,25,45,68,92,111,356"
Dim i As Long
Dim Lh As Long
Dim LL As Long
ui = 2000
While InStr(1, pFile, CStr(ui & ",")) = 0
ui = ui - 1
Wend
Dim t() As String
t = Split(pFile, vbCrLf)
Dim i As Long
For i = 0 To ui - 1
List1.AddItem t(i)'加上上面的回复。
Next
Sub GETALL(ByVal yourstr As String, ByVal SUM As Integer, ByRef RESULT() As String)
Dim A(), I As Long, NUM As Integer, ALLNUM As Long, n As Integer
Dim TEMP1 As Long, TEMP2(1 To 20) As Integer, TEMP As Integer
Dim x() As String
x = Split(yourstr, ",")
n = UBound(x)
ALLNUM = 0
For I = 1 To 2 ^ n
TEMP1 = I
NUM = 0
For j = 1 To n '转换为二进制
TEMP2(j) = TEMP1 And 1 '0 or 1
TEMP1 = TEMP1 \ 2
If TEMP2(j) = 1 Then
NUM = NUM + 1
ReDim Preserve A(1 To NUM)
A(NUM) = x(j - 1)
End If
Next
TEMP = 0
For j = 1 To NUM
TEMP = TEMP + Val(A(j))
Next
If TEMP = SUM Then '满足条件
ALLNUM = ALLNUM + 1
ReDim Preserve RESULT(1 To ALLNUM)
RESULT(ALLNUM) = Join(A, "+") & "=" & SUM '结果保存
Debug.Print RESULT(ALLNUM)
End If
Next
Debug.Print ALLNUM & " 种方法"
MsgBox "OK"
End Sub
Private Sub Command1_Click()
Dim S() As String
GETALL "1,11,20,22,22,23,25,45,68,92,111,356", 45, S '和为19 时
End Sub
Dim result() As Long
Dim used() As Boolean
Dim idx As Long
Dim data As Variant
Private Sub Form_Load()
data = Array(1, 11, 20, 22, 22, 23, 25, 45, 68, 92, 111, 356)
ReDim result(UBound(data))
ReDim used(UBound(data))
GetIt 45
End Sub
Private Sub GetIt(ByVal x As Long)
Dim i As Long, cont As Boolean
If x = 0 Then
'目标达到,输出结果
Dim s As String
For i = 0 To idx - 1
s = s + "+" + Format(result(i))
Next
Debug.Print Mid(s, 2)
Else
'继续搜索
For i = LBound(data) To UBound(data)
cont = False '是否继续的标志
'如果没有超过目标...
If x - data(i) >= 0 And Not used(i) Then
If idx = 0 Then
cont = True
Else
If data(i) >= result(idx - 1) Then cont = True
End If
'判断cont,防止重复: 1+1+2 = 1+2+1
If cont Then
used(i) = True
result(idx) = data(i)
idx = idx + 1
GetIt x - data(i)
idx = idx - 1
used(i) = False
End If
End If
Next
End If
End Sub
Dim result() As Long
Dim min() As Long
Dim idx As Long
Dim data As Variant
Private Sub Form_Load()
data = Array(1, 11, 20, 22, 22, 23, 25, 45, 68, 92, 111, 356)
ReDim result(45)
ReDim min(45)
GetIt 45
End Sub
Private Sub GetIt(ByVal x As Long)
Dim i As Long, cont As Boolean
If x = 0 Then
'目标达到,输出结果
Dim s As String
For i = 0 To idx - 1
s = s + "+" + Format(result(i))
Next
Debug.Print Mid(s, 2)
Else
'继续搜索
For i = LBound(data) To UBound(data)
cont = False '是否继续的标志
'如果没有超过目标...
If x - data(i) >= 0 Then
If idx = 0 Then
cont = True
Else
If data(i) >= result(idx - 1) Then cont = True
End If
'判断cont,防止重复: 1+1+2 = 1+2+1
If cont Then
result(idx) = data(i)
min(idx) = data(i)
idx = idx + 1
GetIt x - data(i)
idx = idx - 1
End If
End If
Next
End If
End Sub