Python之动态规划(最少硬币数找零)

忘是亡心i 2022-02-19 00:29 566阅读 0赞

完整代码:

  1. # 动态规划最少硬币数找零
  2. def dpMakeChange(coinValueList, change, minCoins, coinsUsed):
  3. for cents in range(change + 1): #依次循环从0到所需兑换面值的每一个面值
  4. coinCount = cents #初始化最优解为当前面值数
  5. newCoin = 1 #初始化找零硬币面值列表中的面值
  6. for j in [c for c in coinValueList if c <= cents]:#在不大于要找零的硬币面值列表中循环
  7. # 注:minCoins[cents - j] + 1 = cents - j的最优解 + 1(1是j的最优解,因为j为一个硬币) = cents的最优解 - j的最优解 + j的最优解 = cents的最优解,所以下一行代码的意思就是:若当前面值的最优解比上一循环(或初始)当前面值的最优解更小,则
  8. if minCoins[cents - j] + 1 < coinCount:
  9. coinCount = minCoins[cents - j] + 1 #临时保存当前面值的最优解
  10. # 将当前硬币面值j临时保存为当前找零面值在找零硬币面值列表中的对应值
  11. newCoin = j
  12. minCoins[cents] = coinCount #记录当前找零面值在找零最优解列表中的最优解
  13. coinsUsed[cents] = newCoin #记录当前找零面值在找零硬币面值列表中对应的值
  14. return minCoins[change] #返回待找零数值的最优解
  15. # 获取最终找零的硬币面值
  16. def printCoins(coinsUsed, change):
  17. while change > 0:
  18. thisCoin = coinsUsed[change]#从找零硬币面值列表中获取对应的硬币面值
  19. print(thisCoin, end = '、')
  20. change = change - thisCoin #去除该面值后继续循环获取
  21. def main():
  22. amnt = 63 #待找零面值
  23. clist = [1, 5, 10, 21, 25] #有效硬币面值列表,有序无序都可以
  24. coinsUsed = [0] * (amnt + 1) #初始化找零硬币面值列表
  25. coinCount = [0] * (amnt + 1) #初始化包含所有找零最优解的列表
  26. zhao = dpMakeChange(clist, amnt, coinCount, coinsUsed) #获取找零硬币最少个数
  27. resu = "找零" + str(amnt) + "美分需要" + str(zhao) + "个硬币。"
  28. print(resu)
  29. print("它们是:")
  30. printCoins(coinsUsed, amnt) #获取最终找零的硬币面值
  31. print("\n使用列表如下:")
  32. print(coinsUsed) #找零硬币面值列表
  33. print("所有数值最优解列表如下:")
  34. print(coinCount) #包含从0到所需兑换面值的每一个面值对应的最优解
  35. main()

结果为:

  1. 找零63美分需要3个硬币。
  2. 它们是:
  3. 212121
  4. 使用列表如下:
  5. [1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 10, 1, 1, 1, 1, 5, 1, 1, 1, 1, 10, 21, 1, 1, 1, 25, 1, 1, 1, 1, 5, 10, 1, 1, 1, 10, 1, 1, 1, 1, 5, 10, 21, 1, 1, 10, 21, 1, 1, 1, 25, 1, 10, 1, 1, 5, 10, 1, 1, 1, 10, 1, 10, 21]
  6. 所有数值最优解列表如下:
  7. [0, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 1, 2, 3, 4, 1, 2, 3, 4, 5, 2, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 3, 2, 3, 4, 3, 2, 3, 4, 5, 2, 3, 3, 4, 5, 3, 3, 4, 5, 6, 3, 4, 4, 3]

发表评论

表情:
评论列表 (有 0 条评论,566人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态规划硬币

    > 题目:几年教师节活动中,公司里为培训讲师提供了不同面值的饮料兑换券(每种面值数量不限),培训讲师可以领取兑换券去食堂兑换鲜榨果汁,要求兑换券和果汁必须等价,姜小虎想要兑换一

    相关 动态规划硬币问题

    凑硬币问题 假设有 1 元,3 元,5 元的硬币若干(无限),现在需要凑出 11 元,问如何组合才能使硬币的数量最少? 用数组d来存储当前每个面值可以对应的合成的最小