力扣 322.零钱兑换(动态规划问题)
题目:
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
你可以认为每种硬币的数量是无限的。
输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1
动态规划问题解题一般分为
1、明确问题
2、转移方程
3、初始条件和边界情况
4、计算顺序
我们按照这个步骤来对这道算法题进行解答
一、明确问题(简化定义)
题目说的是用最少多少硬币拼出amount(就是11),那么明确最优策略下,最后一枚硬币只可能是coin[i](i为coin数组下标){就是1和2和5},意思就是拼出最优解的最后一枚硬币一定是三种硬币中的一种,
那么因为是最优策略,所以必须让amount-coin[i](11-coin[i])最少。
那么问题就转化成了另一个问题:
最少用多少枚硬币可以拼出11-coin[i]
简化定义:
设状态f(x)=最少用多少枚硬币可以拼出x
- 如果coin[i]为1,那么f(11)=f(11-1)+1(最后加1是最后一枚硬币)
- 如果coin[i]为2,那么f(11)=f(11-2)+1
- 如果coin[i]为5,那么f(11)=f(11-5)+1
那么此时问题转换成了使得组成最后一枚硬币前面的硬币数量最少
二、转移方程
由上面可知现在问题转化成了
f(11)=min { f(11-1)+1,f(11-2)+1,f(11-5)+1}
f(11)为拼出11所需最少硬币数
f(11-1)为拼出10所需最少硬币数。。。
三、初始条件和边界情况
两个问题::x-1,x-2,x-5小于0怎么办?什么时候使递归停下来?
如果不能拼出x,就定义f(x)=无穷,例如f(-1),f(-2)=无穷
所以f(1)=min{f(0)+1,f(-1)+1,f(-4)+1}
初始条件:f(0)=0
初始条件是转移方程算不出来的,只能通过自己定义,所以说边界条件很重要。
四、计算顺序
α为无穷
f(0) | f(1) | f(2) | f(3) | f(4) | f(5) | f(6) | f(7) | f(8) | ||
---|---|---|---|---|---|---|---|---|---|---|
α | α | 0 | 1 | 2 | 2 | 2 |