有一数值,知道它是由一批数值中的某几个数组成,如何写一程序求出这几个数呢?
例:
数值为:
10414.36数组为:
1134.56
239.26
3598.92
408.27
5272.61
263.28
1111.56
226.53
141
1355.89
3.45
2149.9
10
218.38
150现在手工计算得:10414.36=1134.56+3598.92+408.27+5272.61请问,如何用程序实现呢?
给点思路也行!!!
例:
数值为:
10414.36数组为:
1134.56
239.26
3598.92
408.27
5272.61
263.28
1111.56
226.53
141
1355.89
3.45
2149.9
10
218.38
150现在手工计算得:10414.36=1134.56+3598.92+408.27+5272.61请问,如何用程序实现呢?
给点思路也行!!!
这个就是要用程序实现的原因。
给点儿提示啦!
思路:
(已知:)
数值 a
数组 x(1),x(2),...x(n)(关键,可做成函数:)
将n个数分成m组 ,穷举所有分组。
然后对每组求和,如和为a,打印(或显示)这组数据。
(循环调用函数)
对m从1 到n循环,求出一切可能分组,计算一切可能的求和,如和等于a,打印这组数据。
数组 x(1),x(2),...x(n)分成m个1组,可以归结到将下标1,2,3,...n,m个1组,打印所有分组情况。
Sub GETALL(ByVal SUM As Single, ByVal x As Variant, ByRef RESULT() As String)
Dim A(), I As Long, NUM As Integer, ALLNUM As Long, n As Integer
Dim TEMP1 As Long, TEMP2() As Integer, TEMP As Single
n = UBound(x)
ReDim TEMP2(0 To n - 1)
ALLNUM = 0
For I = 1 To 2 ^ n
TEMP1 = I
NUM = 0
TEMP = 0
For j = 0 To n - 1 '转换为二进制
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)
TEMP = TEMP + x(j)
End If
NextIf Abs(TEMP - SUM) < 0.01 Then '满足条件ALLNUM = ALLNUM + 1
ReDim Preserve RESULT(1 To ALLNUM)RESULT(ALLNUM) = Join(A, "+") & "=" & SUM '结果保存
End If
Next
MsgBox Join(RESULT, vbCrLf), 4096, ALLNUM & " 种方法"End SubPrivate Sub Command1_Click()
Dim x, S() As String
x = Array(1134.56, 239.26, 3598.92, 408.27, 5272.61, 263.28, 1111.56, 226.53, 141, 1355.89, 3.45, 2149.9, 10, 218.38, 150)GETALL 10414.36, x, S '和为10414.36 时
End Sub
Dim x, S() As String
x = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
GETALL 25, x, S '和为25 时
End Sub
返回值:1+2+4+5+6+7=25
3+4+5+6+7=25
1+2+3+5+6+8=25
2+4+5+6+8=25
1+2+3+4+7+8=25
2+3+5+7+8=25
1+4+5+7+8=25
1+3+6+7+8=25
4+6+7+8=25