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

时间:2018-08-06 18:34:55

标签: java algorithm dynamic-programming coin-change

我们有一名实习生使用自上而下的方法来解决最小硬币问题。 问题陈述给出了一组硬币,返回形成总和所需的最小硬币。另外返回构成总和的硬币。

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 个答案:

答案 0 :(得分:3)

好吧,您将min初始化为Integer.MAX_VALUE,然后有以下代码:

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

如您所见,rs.minint,并且永远不会大于min(即Integer.MAX_VALUE)。

您在min处更改的唯一其他地方是:

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

但是,由于min仍然是Integer.MAX_VALUE,因此它将永远不会改变。我会让你从这里拿走。