动态规划---最小硬币数(Python)

本文介绍了使用动态规划解决寻找凑成特定金额(如27元)最少硬币数的问题。通过分析思路,提出动态规划函数F(x),并展示从F(0)到F(27)的计算过程。对比了递归与动态规划在效率上的差异,并提供了通用代码模板。
摘要由CSDN通过智能技术生成

目录

一、具体题目

二、思路

三、扩展


一、具体题目

有3种硬币,面值分别为2元、5元、7元,每种硬币数量都无穷多。求拼成27元的最少硬币数。

二、思路

这个题目乍一看可能很多人认为要用贪心策略,就是尽可能优先使用面值比较大的硬币去凑27元,但是其实这题用动态规划来做。我们可以先想这样一个问题,就是凑够27元的最后一枚硬币i是多少?这个问题可能乍一听毫无逻辑,因为我们要想的凑够27元的全部硬币数,前面的硬币都没有确定,怎么就想到最后一枚了?但是,这个问题使用动态规划的精妙之处就在这里。我们先不管前面是如何凑够27-i的,假设已经凑够了27-i,那么加上i正好27元。那么i是多少呢?

设置一个函数F(x),代表凑够x元需要的最少硬币数量。如果最后一枚硬币i是2,那么凑够27元最少硬币数是F(x-2)+1;如果i是5,那么凑够27元最少硬币数是F(x-5)+1;如果i是7,那么凑够27元最少硬币数是F(x-7)+1。为了使F(x)最小,那么F(x)肯定要取F(x-2)+1、F(x-5)+1和F(x-7)+1中最小的数字。所以F(x)=min(F(x-2)+1,F(x-5)+1,F(x-7)+1)。

然后我们思考一下计算的顺序,因为计算F(x)要先计算F(x-2)、F(x-5)、F(x-7),所以我们从F(0)开始计算,计算到F(27)。这个时候我们还要注意一些事情:F(0)=0;当x小于0或者等于3时是无法凑够的,我们设置这些情况的F(x)=∞(正无穷大)。设置正无穷大是为了在min(F(x-2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值