【问题标题】:Code sometimes returns Integer.MAX_VALUE.Cannot figure out why代码有时会返回 Integer.MAX_VALUE。无法弄清楚原因
【发布时间】:2011-12-19 17:54:43
【问题描述】:

我正在尝试编写代码来返回构成给定数字所需的最少硬币数量。我的方法的输入是一组有效硬币,以及我尝试制作的数字。

    public static int change(int[] d, int p) {
        int[] tempArray = new int[p + 1]; // tempArray to store set
                                            // of coins forming
                                            // answer
        for (int i = 1; i <= p; i++) { // cycling up to the wanted value
            int min = Integer.MAX_VALUE; // assigning current minimum number of
                                            // coins
            for (int value : d) {// cycling through possible values
                if (value <= i) {
                    if (1 + tempArray[i - value] < min) { // if current value is
                                                            // less than min
                        min = 1 + tempArray[i - value];// assign it
                    }
                }
            }
            tempArray[i] = min; // assign min value to array of coins
        }
        return tempArray[p];
    }

这适用于大多数情况,但是,当我填写以下内容时:

int[] test = {2,3,4};
System.out.println("answer = " + change(test, 6));

答案应该是 2,对吧?但它会打印出来:

-2147483647

我错过了什么?

【问题讨论】:

  • 在代码中添加大量调试输出,答案将显而易见。例如,在外层for 之后,输出'top of for, i=' 然后i。在if 之前,输出值、i、tempArray[i-value] 和 min。等等。
  • 谢谢!我想我现在已经修复了我的代码,如果我将 1 + tempArray[i - value] > 0 放入我的 if 语句中,则输出是正确的:)。这是正确的吗?有什么可以改进的吗?

标签: java dynamic dynamic-programming knapsack-problem


【解决方案1】:

因为,在第一次迭代中,tempArray[i] = min; tempArray[i] 被分配给 MAX,而在随后的迭代[s] 中,min = 1 + tempArray[i - value]; 会尝试将 MAX 加一,这基本上会移动位并形成负数.

【讨论】:

  • 我明白了,不过我真的找不到任何简单的方法来解决这个问题。我可以为 min 分配一个 Integer.MAX_VALUE - 10 的值吗?有没有更好的办法?
  • 等等我想我明白了,在 1 + tempArray[i - value] > 0...我只是把它放到我的 if 语句中?! :)
猜你喜欢
  • 2015-03-16
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多