题目描述
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:
输入: coins = [2], amount = 3
输出: -1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/coin-change
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
用动态规划思路,用东哥的套路。
/*** @param {number[]} coins* @param {number} amount* @return {number}*/var coinChange = function(coins, amount) {if (amount < 0) return -1;// 数组大小为 amount + 1,初始值也为 amount + 1let dp = new Array(amount + 1);dp.fill(amount + 1);// base casedp[0] = 0;// 外层 for 循环在遍历所有状态的所有取值for (let i = 1; i <= amount; i++) {// 内层 for 循环在求所有选择的最小值for (let coin of coins) {// 子问题无解,跳过if (i - coin < 0) continue;dp[i] = Math.min(dp[i], dp[i - coin] + 1);}}// 这里要判断一下,如果最终结果还是初始化的结果,代表解不出来,返回-1return (dp[amount] === amount + 1) ? -1 : dp[amount];};
