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

对DP解决方案的硬币兑换理解

段晨
2023-03-14

我有一个练习:

您将获得不同面额的硬币和总金额。请编写一个函数来计算您需要的最少数量的硬币,以弥补该金额。如果硬币的任何组合都无法弥补该金额,请返回-1

例1:

     coins = [1, 2, 5], amount = 11
     return 3 (11 = 5 + 5 + 1)

我还谷歌了一个这样的解决方案:

public class Solution {
    public int coinChange(int[] coins, int amount) {
        int dp[] = new int[amount + 1];
        final int INF = 0x7ffffffe;
        for (int i = 1; i <= amount; i++) dp[i] = INF;
        for (int i = 0; i <= amount; i++) {
            for (int j = 0; j < coins.length; j++) {
                if (i + coins[j] <= amount)
                    dp[i + coins[j]] = Math.min(dp[i + coins[j]], dp[i] + 1);
            }
        }
        return dp[amount] == INF ? -1 : dp[amount];
    }
}

我知道它是关于DP的,但是,我对它很困惑,比如,DP[I coins[j]]的含义是什么,为什么要添加I,为什么要添加DP[I]1,为什么要添加1?

有人能用简单的英语指出出路吗?

共有1个答案

孔鹤龄
2023-03-14

好的,让我们首先看看代码在做什么,它在使用什么。DP用于存储特定值所需的硬币量。它这样做是有序的,所以得到一个值所需的硬币量只是“dp的值项”。但是我们如何得到那个有序的金额列表呢?

他正在使用内部for循环对所有硬币进行测试,试图将硬币的价值添加到当前价值(i)中。如果低于目标金额,他会给它赋值。

dp[i + coins[j]] = (...)

正如我们所知,我们的列表是按值排序的,我们将得到我们需要更改的条目的值,取当前条目的值(i)加上当前硬币的值(硬币[j])。这是它的左边部分。

现在是正确的部分:你在寻找尽可能小的量,所以你在使用数学。min得到n个参数中较小的一个,在这种情况下是两个。第一个参数是我们将要覆盖的值。如果我们已经找到了一个非常好的方法来表示一个值,为什么要覆盖它?我们可能会不小心杀死它,所以我们确保只有当我们找到一个比我们得到的更好的解决方案时才会这样做。第二个参数是我们需要达到当前值1的硬币数量。

(...) = Math.min(dp[i + coins[j]], dp[i] + 1);

如果你还没有完全理解它,请随时要求进一步的细节:)

 类似资料:
  • 我在理解动态规划中的硬币兑换问题时遇到了一个小问题。简单地说,我必须用最少数量的硬币来兑换一笔钱。 我有n种面值为1=v1的硬币

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

  • 给定一个值N,如果我们想换N美分,并且我们有无限量的S={S1,S2,…,Sm}值的硬币,我们可以用多少种方式来换?硬币的顺序无关紧要。 例如,对于N=4和S={1,2,3},有四种解:{1,1,1,1},{1,1,2},{2,2},{1,3}。所以输出应该是4。对于N=10和S={2,5,3,6},有五个解:{2,2,2,2},{2,2,3,3},{2,2,6},{2,3,5}和{5,5}。所以

  • 这是hackerrank(https://www.hackerrank.com/challenges/coin-change)的硬币更换问题。它要求计算使用给定面值的硬币对N进行更改的方法总数。 例如,有四种方法可以使用面额为1、2和3的硬币兑换4。它们是-

  • 以人民币的硬币为例,假设硬币数量足够多。要求将一定数额的钱兑换成硬币。要求兑换硬币数量最少。 思路说明: 这是用贪婪算法的典型应用。在本例中用python来实现,主要思想是将货币金额除以某硬币单位,然后去整数,即为该硬币的个数;余数则做为向下循环计算的货币金额。 这个算法的问题在于,得出来的结果不一定是最有结果。比如,硬币单位是[1,4,6],如果将8兑换成硬币,按照硬币数量最少原则,应该兑换成为

  • 我试图自己解决LeetCode问题322。硬币兑换: 您将获得一个整数数组,表示不同面额的硬币,以及一个整数金额,表示总金额。 返回您需要的最少数量的硬币,以弥补该金额。如果这些硬币的任何组合都无法弥补这一数额,则返回-1。 你可以假设每种硬币的数量是无限的。 我似乎有一个错误,无法找出它。 我用DFS解决,基本上是说当目标达到0时,只需将所有的聚集在一个数组中,并动态地保持尽可能短的结果。这是问