原代码有误,更正并注解如下:
Sub GETALL(ByVal SUM As Single, ParamArray x())
Dim result() As String, n As Integer, b() As Integer
Dim i As Long, j As Long, k As Long, TEMP As Long
Dim sumtemp As Single, resulttemp As String
n = UBound(x) 'n+1个数
ReDim b(n)
k = 0 '记录答案个数
For i = 1 To 2 ^ (n + 1) - 1 '一共2 ^ (n + 1) - 1种组合
TEMP = i
resulttemp = "" '初始化
sumtemp = 0 '初始化
For j = 0 To n
b(j) = TEMP Mod 2 '0 or 1'i的二进制的第j位
TEMP = TEMP \ 2
sumtemp = sumtemp + b(j) * CSng(x(j)) '求和
If b(j) = 1 Then resulttemp = resulttemp & "+" & x(j) '列出表达式
Next
If Abs(sumtemp - SUM) < 0.1 Then '=0为精确解,<0.1 表示误差在0.1范围内的近似解亦可
k = k + 1
ReDim Preserve result(1 To k)
result(k) = Mid(resulttemp, 2) & "=" & Round(sumtemp, 1) '将满足条件的表达式存入数组result()
End If
Next
MsgBox Join(result, vbCrLf) '输出
End Sub
Private Sub Command1_Click() ' 7 number(5.4, 4.2, 3.1, 2.1, 1.3, 0.5, 0.2) and x=9.9
GETALL 9.9, 5.4, 4.2, 3.1, 2.1, 1.3, 0.5, 0.2
End Sub
Sub GETALL(ByVal SUM As Single, ParamArray x())
Dim result() As String, n As Integer, b() As Integer
Dim i As Long, j As Long, k As Long, TEMP As Long
Dim sumtemp As Single, resulttemp As String
n = UBound(x)
ReDim b(n)
k = 0
For i = 1 To 2 ^ n - 1
TEMP = i
resulttemp = ""
sumtemp = 0
For j = 0 To n
b(j) = TEMP Mod 2 '0 or 1
TEMP = TEMP \ 2
sumtemp = sumtemp + b(j) * CSng(x(j))
If b(j) = 1 Then resulttemp = resulttemp & "+" & x(j)
Next
If Abs(sumtemp - SUM) < 0.1 Then '近似解亦可
k = k + 1
ReDim Preserve result(1 To k)
result(k) = Mid(resulttemp, 2) & "=" & Round(sumtemp, 1)
End If
Next
MsgBox Join(result, vbCrLf)
End Sub
Private Sub Command1_Click()' 7 number(5.4, 4.2, 3.1, 2.1, 1.3, 0.5, 0.2) and x=9.9
GETALL 9.9, 5.4, 4.2, 3.1, 2.1, 1.3, 0.5, 0.2
End Sub