代码之家  ›  专栏  ›  技术社区  ›  brain storm

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

  •  1
  • brain storm  · 技术社区  · 8 年前

    我们让实习生用自上而下的方法解决最小硬币问题。 问题陈述是给定一组硬币,返回构成总和所需的最小硬币数。另外,还回形成总数的硬币。

    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 回复  |  直到 8 年前
        1
  •  3
  •   Jacob G.    8 年前

    好吧,你初始化 min Integer.MAX_VALUE ,然后具有以下代码:

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

    如你所见, rs.min 是一个 int 永远不会超过 最小值 (即 Integer.MAX_值 ).

    你唯一改变的地方 最小值 地址如下:

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

    但是,因为 最小值 仍然 Integer.MAX_值 ,它永远不会改变。我让你从这里拿走。

    推荐文章