python数据结构——动态规划

这篇博客探讨了如何使用动态规划策略解决找零问题,以实现最少硬币数的最优解。通过对比贪心算法和递归方法,解释了在不同硬币面值系统下,动态规划的优势,并提供了利用递归和查表避免重复计算的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在计算机科学中,许多程序是为使一些问题得到最优解而写;例如,找到两点间的最短路径,找到最匹配一组点的线,或找到满足某些条件的最小对象集。计算机学家有许多策略来解决这些问题。 动态规划是这类求最优解问题的解决策略之一。

优化问题的一个典型例子就是用最少的硬币来找零。假设你是一家自动售货机制造商的程序
员。你的公司正设法在每一笔交易找零时都能提供最少数目的硬币以便工作能更加简单。假设一个顾客投了1美元来购买37美分的物品。你用来找零的硬币的最小数量是多少?答案是六枚硬币:两个25 美分,一个10美分,三个1美分。我们是怎么得到六个硬币这个答案的呢?

首先我们要使用面值中最大的硬币(25美分),并且尽可能多的使用它,接着我们再使用下一个可使用的最大面值的硬币,也是尽可能多的使用。这种方法被称为 贪心算法,因为我们试图尽可能快的解决一个问题。

当我们使用美国硬币时,贪心算法工作的很好,但假设你的公司决定在Lower Elbonia (注释: 漫画中杜撰的原东欧共产主义国家的南部)也部署自动售货机,那个地方除了有 1,5,10和25美分的硬币外,还有21美分的硬币。在这种情况下,贪心算法就不能找到63美分找零问题的最优解了。多了21面值的美分,贪心算法的答案仍是六个硬币,然而问题的最优解是三个21美分的硬币。

让我们来看看一个肯定能让我们找到问题的最优解的算法。我们可以使用递归的方法解决问题。首先我们要弄清楚基本结束条件。如果我们要找的零钱的价值和某一种硬币的价值一样,那么答案很简单,只要一个硬币。如果价值不匹配,我们就有几种选择。我们需要的是一个 1 美分加上给原始价值减去 1 美分找零所需硬币数量的最小值,或者一个 5 美分加上给原始价值减去 5 美分找零所需硬币数量的最小值,或者一个 10 美分加上给原始价值减去 10 美分找零所需硬币数量的最小值,等等。所以,给原始总数找零的硬币数量可以根据下面的方法计算:在这里插入图片描述

#较为低效的递归
def recMC(coinValueList,cha
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值