Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对DP解决方案的硬币兑换理解_Java - Fatal编程技术网

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

Java 对DP解决方案的硬币兑换理解,java,Java,我有一个练习: 您将获得不同面额的硬币和总金额。请编写一个函数来计算您需要的最少数量的硬币,以弥补该金额。如果硬币的任何组合都无法弥补该金额,请返回-1 例1: 我还在谷歌上搜索了这样一个解决方案: public class Solution { public int coinChange(int[] coins, int amount) { int dp[] = new int[amount + 1]; final int INF = 0x7ffffff

我有一个练习:

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

例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];
    }
}
公共类解决方案{
公共整数硬币兑换(整数[]硬币,整数金额){
int dp[]=新int[金额+1];
最终int INF=0x7ffffffe;

对于(int i=1;i好的,那么让我们首先看看代码在做什么,它在使用什么。DP用于存储某个值所需的硬币数量。它是按顺序进行的,以获得某个值所需的硬币数量只是“DP的值项”。但是,我们如何获得按顺序排列的金额列表呢

他使用内部for循环对所有硬币进行测试,试图将硬币的价值添加到当前值(i)中。如果该值小于目标值,他将为其指定一个值

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

现在来看正确的部分:您正在寻找尽可能小的数量,所以您使用Math.Min来获取n个参数中的较小值,在这种情况下为2个。第一个参数是我们将要覆盖的值。如果我们已经找到了一种表示值的非常好的方法,为什么要覆盖它?我们可能会意外地杀死它,因此我们确保只会这样做因此,如果我们找到了一个不比我们得到的更好的解决方案,第二个参数就是我们需要得到当前值+1的硬币数量

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

如果您尚未完全理解,请随时询问更多详细信息:)

你了解
dp
数组存储的内容吗?如果你了解这一点,算法就相当简单了。你的导师希望你从头开始编写解决方案,而不是通过谷歌搜索解决方案。这样你可能会学到一些东西。这让我感到沮丧,因为这个问题获得了4票。Thx!所以在大多数情况下,“dp[i]+1”将是“dp[i+硬币[j]]的价值”?因此,如果我理解正确,该程序实际上列出了价值低于金额的硬币组合的所有可能性?是的,它将首先计算所有可能的值及其最佳解决方案,以最终找到适合您的价值的最佳解决方案。这被称为贪婪算法,效率非常低。意外地按enter twice,所以另一个评论是。“dpi[i]+1”和dpi[i+硬币[j]]”不需要相同。它只是检查这两种方法中的更好的一种。可能是您已经找到了一种好方法,并且您不想失去该值,所以您可以选择这两种方法中的更好的一种:)回答得好!谢谢!
(...) = Math.min(dp[i + coins[j]], dp[i] + 1);