找零兑换:动态规划解法
中间结果记录可以很好解决找零兑换问题
实际上, 这种方法还不能称为动态规划,而是叫做“memoization(记忆化/函数值缓存) ”的技术提高了递归解法的性能
动态规划算法采用了一种更有条理的方式来得到问题的解
找零兑换的动态规划算法从最简单的“1分钱找零”的最优解开始, 逐步递加上去, 直到我们需要的找零钱数
在找零递加的过程中, 设法保持每一分钱的递加都是最优解, 一直加到求解找零钱数, 自然得到最优解
递加的过程能保持最优解的关键是, 其依赖于更少钱数最优解的简单计算, 而更少钱数的最优解已经得到了。
问题的最优解包含了更小规模子问题的最优解, 这是一个最优化问题能够用动态规划策略解决的必要条件。
originalamount找零兑换问题具体来说就是:
找零兑换:动态规划算法
采用动态规划来解决11分钱的兑换问题
从1分钱兑换开始,逐步建立一个兑换表
计算11分钱的兑换法, 我们做如下几步:
- 首先减去1分硬币,剩下10分钱查表最优解是1
- 然后减去5分硬币,剩下6分钱查表最优解是2
- 最后减去10分硬币,剩下1分钱查表最优解是1
通过上述最小值得到最优解: 2个硬币
找零兑换:动态规划算法代码
def dpMakeChange(coinValueList, change, minCoins):
# 从1分开始到change逐个计算最好硬币数
for cents in range(1, change+1):
# 1. 初始化一个最大值
coinCount = cents
# 2. 减去每个硬币,向后查最