ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1457|回复: 0

关于钱数凑整的一点体会

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-24 11:05 | 显示全部楼层 |阅读模式
本帖最后由 kangren6772 于 2018-12-24 11:06 编辑

给定的固定的金额,比如200元,用100、50、20、10、5、2、1元等金额(可以更多)凑成200的方法的解决办法,本人想了4种,有更好的本人水平有限
,希望高手能给出更好的解答,下面给出我的解法,2种递归,两种循环:
Option Base 1
Dim jg(10000, 1), k&
Sub perpare()
  Erase jg: k = 0
  Dim arr%(6)
  arr(1) = 100: arr(2) = 50
  arr(3) = 20: arr(4) = 10
  arr(5) = 5: arr(6) = 1
  Call rec1(arr(), 1, 0, "")
  [a1].Resize(10000) = jg
End Sub
Sub recursion(ByRef arr%(), a%, b%, str$)
  If b = 200 Then k = k + 1: jg(k, 1) = Right(str, Len(str) - 1)
  If b < 200 And a < UBound(arr) + 1 Then
    Call recursion(arr(), a, b + arr(a), str & "+" & arr(a))
    Call recursion(arr(), a + 1, b, str)
  End If
End Sub
Sub recursion1(ByRef arr%(), a%, b%, str$)
  Dim i%
  For i = a To UBound(arr)
    If b > 200 Then Exit Sub
    If b = 200 Then k = k + 1: jg(k, 1) = Right(str, Len(str) - 1): Exit Sub
    Call recursion1(arr, i, b + arr(i), str & "+" & arr(i))
  Next
End Sub
Sub test()
  Dim arr(6), k&
  arr(1) = 100: arr(2) = 50
  arr(3) = 20: arr(4) = 10
  arr(5) = 5: arr(6) = 1
  Dim a%, b%, c%, d%, e%, f%
  Dim sum1&, sum2&, sum3&, sum4&, sum5&, sum6&
  For a = 0 To Int(200 / arr(1))
    If sum1 > 200 Then Exit For
    If sum1 = 200 Then k = k + 1: Exit For
    sum1 = sum1 * a
    For b = 0 To Int(200 / arr(2))
      sum2 = sum1
      If sum2 > 200 Then Exit For
      If sum2 = 200 Then k = k + 1: Exit For
      sum2 = sum2 + b * arr(2)
      For c = 0 To Int(200 / arr(3))
        sum3 = sum2
        If sum3 > 200 Then Exit For
        If sum3 = 200 Then k = k + 1: Exit For
        sum3 = sum3 + c * arr(3)
        For d = 0 To Int(200 / arr(4))
          sum4 = sum3
          If sum4 > 200 Then Exit For
          If sum4 = 200 Then k = k + 1: Exit For
          sum4 = sum4 + d * arr(4)
          For e = 0 To Int(200 / arr(5))
            sum5 = sum4
            If sum5 > 200 Then Exit For
            If sum5 = 200 Then k = k + 1: Exit For
            sum5 = sum5 + e * arr(5)
            For f = 0 To Int(200 / arr(6))
              sum6 = sum5
              If sum6 > 200 Then Exit For
              If sum6 = 200 Then k = k + 1: Exit For
              sum6 = sum6 + f * arr(6)
  Next f, e, d, c, b, a
  'Debug.Print k
End Sub

Sub test()
  k = 0
  arr(1) = 100: arr(2) = 50: arr(3) = 20: arr(4) = 10
  arr(5) = 5: arr(6) = 1: Const rel = 200
  Dim a%, b%, i%, j%, zz%(6), zt%(6), sum&
  For a = 1 To UBound(arr): zz(a) = rel \ arr(a): Next
  i = UBound(arr)
  Do
    sum = 0: j = 0
    For a = i To 1 Step -1
      If zt(a) < zz(a) Then Exit For
    Next
    If a = 0 Then Exit Do
    zt(a) = zt(a) + 1
    For b = a + 1 To 6: zt(b) = 0: Next
    i = UBound(arr): For b = 1 To a: sum = sum + zt(b) * arr(b): Next
    Do
      If sum = rel Then k = k + 1: i = i - 1: Exit Do
      If sum > rel Then: i = i - 1: Exit Do
      sum = sum + arr(i)
    Loop
Loop
'Debug.Print k
End Sub


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-25 16:47 , Processed in 0.025078 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表