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

硬币变化动态编程

孙思源
2023-03-14

问题:我很难找到达到特定金额所需的最低硬币数量。我很确定这是最简单的递归方式,使用动态编程方法,我基本上应该得到Math.min(“获取ACoin”、“离开ACoin”);不幸的是,我的代码不会终止,尽管我确实有在满足总和的条件下终止的if语句,硬币数组耗尽,或者如果总和结束。请查看下面的代码,让我知道我做错了什么,特别是为什么我的代码继续执行,直到它收到一个stackoverflow错误,尽管我有适当的终止条件。

代码:

    private static final int S = 3;
public static int arr[] = {1,2};
public static void main(String[] args) {
    Interview i = new Interview();
    i.sumCoins(arr, 0);
}
public int sumCoins(int[] ar, int sum) {
    //if the sum is met, dont add any coins, just return 0
    if(sum == S){
        return 0;
    }
    //if the sum is greater, then return max value as it is impossible to get less sum
    if(sum > S){
        return Integer.MAX_VALUE;
    }
    //if the array is out of coins return max value
    if(ar.length == 0){
        return Integer.MAX_VALUE;
    }
    //if the sum is less than S and there is still more coins to use, keep checking
    //add the first coin
    int tmpSum = sum + ar[0];
    //delete the first coin from the list
    int[] tmp = Arrays.copyOfRange(ar, 1, ar.length);
    //add one coin to the solution
    int one = 1+sumCoins(tmp, tmpSum);
    //don't add one coin to the solution
    int two = sumCoins(ar,sum);

    //see which is more minimized
    return Math.min(one,two);
}

请求的堆栈跟踪:
异常在线程"main"java.lang.StackOverflow错误

在java.lang.Math.min(Math.java:879)
在java.util.rrays.copyOfRange(rrays.java:2623)
在我nterview.sum硬币(我nterview.java:28)
在我nterview.sum硬币(我nterview.java:32)
在我nterview.sum硬币(我nterview.java:32)

共有1个答案

弘和同
2023-03-14

这个问题的答案是关于我是如何实现动态规划的。我用的是你留下硬币时的原始阵列。这是不正确的。更详细地说:如果你拿硬币:去掉数组的第一个(硬币)索引,加上总和,硬币数量加1。如果你不拿硬币:去掉数组的第一个(硬币)索引,因为你不考虑该硬币。

在我的解决方案中,我收到了一个stackoverflow,因为我经历了无限次“离开硬币”场景,因为数组从未减少,实际上我没有“离开硬币”。请在此更正代码:

private static final int S = 5;
public static int arr[] = {1,1,1,1,1};
public static void main(String[] args) {
    Interview i = new Interview();
    System.out.println(i.sumCoins(arr, 0));
}
public int sumCoins(int[] ar, int sum) {
    //if the sum is met, dont add any coins, just return 0
    if(sum == S){
        return 0;
    }
    //if the sum is greater, then return global array (not local)
    //length +1 as it's impossible to get more coins than indices
    if(sum > S){
        return arr.length+1;
    }
    //if the array is out of coins return max value
    if(ar.length == 0){
        return arr.length+1;
    }
    //if the sum is less than S and there is still more coins to use, keep checking
    //add the first coin
    int tmpSum = sum + ar[0];
    //delete the first coin from the list
    int[] tmp = Arrays.copyOfRange(ar, 1, ar.length);
    //add one coin to the solution
    int one = 1+sumCoins(tmp, tmpSum);
    //don't add one coin to the solution
    int two = sumCoins(tmp,sum);

    //see which is more minimized
    return Math.min(one,two);

}
 类似资料:
  • 我目前正在尝试用Python实现动态编程,但我不知道如何设置回溯部分,使其不会重复排列。例如,一个输入应该是(6,[1,5]),预期的输出应该是2,因为有两种可能的方式来排列1和5,使它们的总和等于6。这些组合是{1,1,1,1,1}和{1,5}但是我的程序目前的工作方式,它考虑了上面显示的组合和组合{5,1}。这导致输出为3,这不是我想要的。所以我的问题是“如何防止重复排列?”。我当前的代码如下

  • 我的硬币兑换动态编程实现在一些测试用例中失败,我很难找出原因: 问题陈述:给定一个数量和一个硬币列表,找出制造该数量所需的最小硬币数量。 例如: 目标金额:63 硬币列表:[1,5,10,21,25] 输出:[21,21,21] 小装饰品:https://trinket.io/python/43fcff035e

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

  • 给定一个值N,如果我们想改变为N美分,并且我们有无限量的S={S1,S2,...,Sm}值的硬币,我们有多少种方法可以改变?硬币的顺序并不重要。不过还有一个额外的限制:你只能用正好是K的硬币换零钱。 例如,对于N=4,k=2和S={1,2,3},有两个解:{2,2},{1,3}。所以输出应该是2。 解决方案: 以上是递归解决方案。但是,我需要有关动态规划解决方案的帮助: 让表示与元素和硬币的总和。

  • 我见过很多硬币更换问题,这个问题很独特。我尝试使用DP和递归,但我无法解决它。 这就是问题所在: 假设给定一个价格,X,其中X是美分,我有5种有限面额的硬币,1,5,10,20,50。我有不同数量的1、5、10、20、50分硬币。我想用最大数量的硬币来确定价格X。我该怎么做?(假设X总是可以用手头的硬币制作) 例如,如果价格X=52,并且 我有三枚一分硬币 我有四枚五分硬币 我有8枚10美分的硬币

  • 我试图用递归来解决硬币兑换问题,遇到了下面的代码。 问题:给定一些面额的无限硬币,计算它们形成给定数量的方式。 输入: 代码: 我理解代码本身,也理解基本情况,但是我不理解它是如何封装递归/解决方案的。 例如,如果我正在求解,我可以说,因此我可以清楚地“看到”递归。在换硬币的例子中,我无法推断出类似的关系。有人能帮我吗?