目录
一、具体题目
有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)