一、题目
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
你可以认为每种硬币的数量是无限的。
二、完全背包解析
题目要求使用硬币凑总金额,每枚硬币可以使用多次,要求硬币个数最少,所以是完全背包问题,硬币个数最少是组合问题
(1)确定dp数组及下标含义
dp[j] 表示:总金额为 j 时,硬币最少是多少枚
(2)确定递推表达式
对于硬币 coins[i] 存在两种情况,要么放,要么不放,所以有:dp[j],dp[j-coins[i]]+1
所以要求硬币最少的情况为:Math.min(dp[j],dp[j-coins[i]]+1);
这里之所以执行加1操作,是因为这里是求得是硬币数目,如果是求组合个数则不加1,或者也可以认为和初始化时的情况有关
(3)确定初始化情况
dp[0]=0;表示当总金额为0时,需要0枚硬币
同时对于非零的情况初始化为无穷大,因为此时求最小