JavaScript|LeetCode|动态规划|322. 零钱兑换

法1:动态规划
看了题解
想法:

  1. 总金额amount是背包容量
  2. coins是物品(coins.length是物品种类;coins[i]为每种物品的体积)
  3. 每种物品有无限个
  4. 目标:用最少数量的物品把背包填满
/** 
* @param {number[]} coins 
* @param {number} amount 
* @return {number} 
*/
var coinChange = function(coins, amount) {    
    // amount是背包容量    
    // coins是物品(coins.length是物品种类;coins[i]为每种物品的体积)    
    // 每种物品有无限个    
    if(amount == 0) {        
        return 0;    
    }
    var dp = [], i = 0, j = 0;    
    for(j = 0; j <= amount; j++) {        
        dp[j] = 0;    
    }
    
    for(j = 0; j < coins.length; j++) { // 遍历每一个硬币    
        // 对每一个硬币,遍历可以装下它的背包        
        // 硬币不限数量:从小包往大包遍历,可以实现同一面额的硬币的多次加入        
        for(i = coins[j]; i <= amount; i++) {             
            if(i == coins[j]) {                 
                // 正好可以装下                
                dp[i] = 1;            
            }            
            else if(dp[i] == 0 && dp[i - coins[j]] != 0) {                 
                // 容量为i的背包:第一次试着装入                
                dp[i] = dp[i - coins[j]] + 1;            
            }            
            else if(dp[i - coins[j]] != 0) {                 
                // 容量为i的背包:已经装入过,比较两种装入方式,哪种硬币数量更少                
                dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);            
            }        
        }    
    }
    
    if(dp[amount] == 0) {        
        return -1;    
    }    
    else {        
        return dp[amount];    
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值