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

最小硬币自上而下的解决方案没有给出预期的结果

农明辉
2023-03-14

我们让一个实习生用自上而下的方法解决最小硬币问题。问题陈述给出了一组硬币,返回构成总和所需的最小硬币。此外,还应返还构成金额的硬币。

Eg: coins = {7, 3, 2, 6}, total = 13,
result should be minCoins = {2}, coinsUsed = {7,6}

这是密码

package dp;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MinimumCoin {

    public static void main(String[] args) {

        int total = 13;
        int coins[] = {7, 3, 2, 6};

        Result rs  = minCoin(coins, total, new HashMap<>());
        System.out.println(rs.min);
        System.out.println(rs.coins);

    }

    public static Result minCoin(int[] coins, int total, Map<Integer, Result> memo) {

        if (total == 0) {
            return new Result();
        }

        if (memo.containsKey(total)) {
            return memo.get(total);
        }

        int min = Integer.MAX_VALUE;
        List<Integer> coinsSoFar = new ArrayList<>();

        for (int i = 0; i<coins.length; i++) {

            if (coins[i] > total) {
                continue;
            }

            Result rs = minCoin(coins, total-coins[i], memo);
            coinsSoFar.add(coins[i]);
            if (rs.min > min) {
                min = rs.min;
                coinsSoFar.addAll(rs.coins);
            }
            else {
                coinsSoFar.remove(coinsSoFar.size()-1);
            }
        }

        min =  (min == Integer.MAX_VALUE ? min : min + 1);

        Result rs = new Result(min, coinsSoFar);

        memo.put(total, rs);
        return rs;
    }

    public static class Result {

        private int min;
        private List<Integer> coins = new ArrayList<>();

        private Result() {}
        private Result(int min, List<Integer> coins) {
            this.min = min;
            this.coins = coins;
        }


    }
}

代码在大部分情况下看起来不错。但不会返回预期的结果。当使用上述输入执行时,程序返回INT.MAX作为minCoins,列表为空。

有关于代码哪里出错的提示吗?谢谢

共有1个答案

轩辕晔
2023-03-14

那么,您将min初始化为整数。最大值,然后具有以下代码:

if (rs.min > min) {
    min = rs.min;
    coinsSoFar.addAll(rs.coins);
}

如您所见,rs.min是一个int,并且永远不会大于min(也就是整数。MAX_VALUE)。

您更改min的唯一其他位置是:

min =  (min == Integer.MAX_VALUE ? min : min + 1);

但是,因为min仍然是整数。最大值,它永远不会改变。我让你从这里拿走。

 类似资料:
  • 问题是: 下面是我的Java类,我认为它的代码可以解决问题9:

  • 这是Leetcode的硬币兑换问题,在这里,给定面额的硬币是无限的,你必须找到满足给定金额所需的最小硬币。我尝试使用自顶向下的1D缓存阵列解决这个问题。基本测试用例通过了,但对于一些较大的总和和面额值,它失败了。我的假设是,我在遍历数组时做错了什么,可能遗漏了一些子问题的计算,但无法找到解决问题的方法。 问题陈述: 我的解决方案:

  • 尝试[解决]leetcode(322)中的问题: 你会得到不同面额的硬币和总金额。写一个函数来计算你需要的最少数量的硬币来组成这个数量。如果这些硬币的任何组合都不能弥补这个金额,返回-1。 我被困在这个输入:硬币=[2]和目标=3 我想知道它为什么返回0?我调试了这个,但没能弄清楚。

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

  • 我有一个练习: 您将获得不同面额的硬币和总金额。请编写一个函数来计算您需要的最少数量的硬币,以弥补该金额。如果硬币的任何组合都无法弥补该金额,请返回-1 例1: 我还谷歌了一个这样的解决方案: 我知道它是关于DP的,但是,我对它很困惑,比如,的含义是什么,为什么要添加,为什么要添加,为什么要添加1? 有人能用简单的英语指出出路吗?

  • 给定一个值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}。所以