Код для замены монет

#arrays #dynamic-programming

#массивы #динамическое программирование

Вопрос:

Проблема: https://leetcode.com/problems/coin-change /

Решение: https://repl.it/@Stylebender/HatefulAliceblueTransversal#index.js

 var coinChange = function(coins, amount) {

    let dp = Array(amount   1).fill(Infinity); //Fill dp array with dummy values

    dp[0] = 0; 

    for (let i = 1; i <= amount; i  ) { 
        for (let j = 0; j < coins.length; j  ) { //Iterate through coin denominations
            if (coins[j] <= i) { //Is current coin denomination less than amount? 
                dp[i] = Math.min(dp[i], 1   dp[i - coins[j]]); 
                //dp array[current amount - coin denomination]
            }
  }
}

return dp[amount] === Infinity ? -1 : dp[amount]; 
};
  

Я понимаю общий концептуальный ход решения по созданию массива dp с помощью кнопки вверх, но мне просто интересно, что касается строки 10:

dp [i] = Math.min(dp [i], 1 dp[i — монеты [j]]);

Почему при выборе текущего номинала j-й монеты для рассмотрения отображается 1 ?

Это потому, что, поскольку существует действительный номинал монеты, мы открыли новый метод для пополнения i-й суммы?

Ответ №1:

  • Да, это верно. Мы бы приблизились к целевой сумме на один шаг.

  • Если, например, 0,5 будет каким-то минимальным шагом, то это стало бы 0,5 остальное.

 const coinChange = function(coins, amount) {
    const inf = Math.pow(2, 31)
    const dp = []
    dp[0] = 0

    while (dp.length <= amount) {
        let curr = inf - 1
        for (let index = 0; index < coins.length; index  ) {

            if (dp.length - coins[index] < 0) {
                continue
            }

            curr = Math.min(curr, 1   dp[dp.length - coins[index]])
        }

        dp.push(curr)
    }

    return dp[amount] == inf - 1 ? -1 : dp[amount]
};
  
  • Может быть, это было бы легче понять на Python:
 class Solution:
    def coinChange(self, coins, amount):
        dp = [0]   [float('inf')] * amount
        for index in range(1, amount   1):
            for coin in coins:
                if index - coin > -1:
                    dp[index] = min(dp[index], dp[index - coin]   1)
        
        return -1 if dp[-1] == float('inf') else dp[-1]