[leetcode] 518. Coin Change 2 -- JavaScript 代码【动态规划】

185 篇文章 0 订阅
57 篇文章 1 订阅
var change = function(amount, coins) {
    var dpArray = [];
    for(let i=0;i<amount+2;i++){
        dpArray[i] = 0;
    }
    dpArray[0] = 1;
    coins.forEach(function(coin){
        for (var i = coin; i <= amount; i++) {
            // 以i=coin作为起始条件,可以避免重复计算3=1+2=2+1这种情况
            dpArray[i] += dpArray[i-coin];
        }
    });
    return dpArray[amount];
};

这道题首先想到的已经不是递归求解了!应该是动态规划~有进步有进步嘿嘿。。。

首先,JavaScript的数组有一个很让人脸蛋疼的特性,就是初始化的时候数组元素全都是undefined,而不是0。因此,我们首先要对所有的数组元素置零,以方便后续的计算。

接下来,动态规划数组的初始条件是,dp[0] = 1,表示,当我们要凑0元的时候,我们只有一种选择,那就是所有的钱币都不选。

接下来,随着我们对数组coins的访问,dp也在不断变化;并且,每访问一个元素,dp[index]的结果就表示,在访问到这个钱币为止的条件下(比如我们访问到了[1,2,5]中的2的时候,就表示我们只用1,2两个面值时的结果),可以凑足index元钱的方法有多少种呢?;这样,当我们访问完了数组所有的元素时,dp[amount]就是我们期望的结果。

下面,是对for循环中:dpArray[i] += dpArray[i-coin];的解释:
这就表示,如果我们想知道凑齐i块钱有多少种途径,那么我们就要去看凑齐i-coin(当前硬币金额)有多少种途径。随着对coin面值的依此访问,我们就可以将所有的结果加起来,得到我们最终所求的凑齐amount元钱的途径数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值