|
楼主 |
发表于 2014-10-23 23:18
|
显示全部楼层
下面是我研制这个附件的过程,这个过程中的中间结果还是很愚蠢的,但是很有意义,因为:
“中间结果或中间步骤最能反映思路”!!!
因此,自我做一个标记:
这就是,我一开始是用嵌套for循环4层固定解决只选择4种商品时的金额匹配问题的,以检验我的解决问题的思路是否正确、有效,在此基础上,在利用递归,抽象出共同步骤,扩展至任意n层循环的一揽子解决……
这些中间代码如下:
- '以下为开票明细(aoe1981之小学版)过渡代码:
- '(普通4层循环代码,并由此步入递归)
- Option Explicit
- Public Sub CouShu0()
- Dim n%, zje#, dj, i&, wc As Boolean, wcz#, t#
- t = Timer
- n = Range("b3").Value '项目数
- If n = 0 Then MsgBox "请勾选项目!", , "友情提示": Exit Sub
- zje = Range("b2").Value '总金额
- ReDim sl&(1 To n, 1 To 1), je#(1 To n) '数量、金额
- dj = Range("e9:e" & 8 + n).Value '单价
- If Range("b4").Value <> "是" Then wc = False Else wc = True: wcz = Range("b5").Value
- je(1) = zje - WorksheetFunction.Sum(dj)
- sl(1, 1) = je(1) \ dj(1, 1)
- Dim i1&, i2&, i3&, i4&, pd As Boolean, s$, gd
- For i1 = sl(1, 1) To 0 Step -1
- je(2) = je(1) - dj(1, 1) * i1: sl(2, 1) = je(2) \ dj(2, 1)
- For i2 = sl(2, 1) To 0 Step -1
- je(3) = je(2) - dj(2, 1) * i2: sl(3, 1) = je(3) \ dj(3, 1)
- For i3 = sl(3, 1) To 0 Step -1
- je(4) = je(3) - dj(3, 1) * i3: sl(4, 1) = je(4) \ dj(4, 1)
- For i4 = sl(4, 1) To 0 Step -1
- If wc Then
- If Abs(je(4) - dj(4, 1) * i4) <= wcz Then pd = True: s = i1 & "-" & i2 & "-" & i3 & "-" & i4: GoTo 100
- ElseIf je(4) - dj(4, 1) * i4 = 0 Then
- pd = True
- s = i1 & "-" & i2 & "-" & i3 & "-" & i4
- GoTo 100
- End If
- Next i4
- Next i3
- Next i2
- Next i1
- 100:
- gd = Split(s, "-")
- If pd Then
- For i = 1 To n
- sl(i, 1) = gd(i - 1) + 1
- Next i
- Range("f9").Resize(n) = sl
- MsgBox "用时:" & Format(Timer - t, "0.0000") & "秒。", , "友情提示"
- Else
- MsgBox "抱歉,没有找到!", , "友情提示"
- End If
- End Sub
复制代码
|
|