零钱兑换 动态规划

零钱兑换

 

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

解题思路,其实这一个一维的动态规划, 总结金额 从0 增加到amout;

1. 对总金额 i,兑换方式可以是: 从中任意取出一个硬币后,剩下金额的对方方式+1; 因为是任意的,取出的币值就是coins中的元素。 因此计算最少方式,就是取各种币值后,计算各种情况下(剩下金额的对方方式+1) 的最小值;

dp[i] = Min(dp[i-coins[0]],   dp[i-coins[1]],  dp[i-coins[2]] ....)

2. 边界条件:

总金额为0时,兑换方式为0;(为了方便后面计算)

取出的币值不能大于当前金额

取出币值后的剩下总金额,必须要有兑换方案,否则这个币值不考虑;

 

/**
 * @param {number[]} coins
 * @param {number} amount
 * @return {number}
 */
var coinChange = function(coins, amount) {

    const dp =[0];
    for(let i = 1 ; i <= amount;i++){
        dp[i] = +Infinity;
        for(let j= 0;j=coins[j] && dp[i-coins[j]] >= 0){
                dp[i] = Math.min(dp[i], dp[i-coins[j]]+1)
            }
        }
        if(dp[i] === +Infinity) dp[i] = -1;
    }
    return dp[amount];

};

 

你可能感兴趣的:(基础算法)