当前位置: 首页 > 知识库问答 >
问题:

硬币更换Leetcode

金兴朝
2023-03-14

问题:https://leetcode.com/problems/coin-change/

解决方案:https://repl.it/@Stylebender/HatefulAliceBlueTransverse#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]=数学。最小值(dp[i],1 dp[i-硬币[j]];

当你选择当前的第j种硬币面额作为考虑因素时,为什么会出现1?

是因为既然有了有效的硬币面额,我们就解锁了一种新的方法来弥补第i个金额吗?

共有1个答案

周凯捷
2023-03-14

>

例如,如果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]
 类似资料:
  • https://leetcode.com/problems/coin-change 以下输入得到超时,如果19- 有人知道哪里出了问题吗?

  • 动态规划变更问题(有限硬币)。我正在尝试创建一个以以下内容作为输入的程序: 输出: 输出应该是大小为1的数组,其中每个单元格代表我们需要改变单元格索引量的最佳硬币数。 假设数组的单元格位于index: 5,内容为2。这意味着为了给出5(INDEX)的变化,您需要2(单元格的内容)硬币(最佳解决方案)。 基本上,我需要这个视频的第一个数组的输出(C[p])。这与有限硬币的大区别是完全相同的问题。链接

  • 硬币兑换是一个非常普遍的问题,它问你有多少种方法可以使用硬币(C[0],C[1]…C[K-1])得到N美分的总和。DP解决方案是使用方法s(N,K)=s(N,K-1)s(N-C[K-1],K),其中s(N,K)是与前K个硬币(按升序排序)求和N的方法数量。这意味着使用前K个硬币获得N美分的方式数量是不使用第K个硬币获得相同金额的方式数量加上获得N-第K个硬币的方式数量的总和。我真的不明白你怎么会想

  • 所以我对编码不熟悉,我得到了一个任务,我需要做一个程序,用四分之一、一角、五分和一美分给不到一美元的零钱。然而,作业希望程序打印所需的最低硬币数量(例如,如果我输入58美分,那么输出应该是“2个25美分,1个镍和3个便士”,而不是“2个25美分,0个10美分,1个镍和3个便士”。本质上,如果没有某种硬币,那么程序就不应该打印它)。我一直在想如何制作它,这样程序就不会打印任何不必要的硬币。 这就是我

  • 尝试为一般硬币更换问题编程一个DP解决方案,该解决方案还可以跟踪使用的硬币。到目前为止,我一直在努力给我所需的最低硬币数量,但不知道如何获得使用了哪些硬币以及使用了多少次。我尝试设置另一个表(布尔值),如果硬币被使用,但这似乎不能正常工作。有什么想法吗?

  • 具体而言,问题是: 给定面额数组<代码>硬币[],每个硬币的限制数组<代码>限制[]和数量<代码>金额,返回所需的最小硬币数量,以获取<代码>金额,或者如果不可能,返回空值。另外,用溶液中使用的每个硬币的数量填充数组 这是我的解决方案: 但它一般不起作用。 我的问题是,例如,在这种情况下: 最佳解决方案是: 并且我的算法给出作为结果。换句话说,它失败了,每当在某种情况下,我将不得不使用比可能的更少