【问题标题】:Coin change algorithm always returning one硬币找零算法总是返回一个
【发布时间】:2011-12-18 06:06:31
【问题描述】:
/**
 * 
 * @param d
 *            currency divisions
 * @param p
 *            target
 * @return number of coins
 */
public static int change(int[] d, int p) {
    int[] tempArray = new int[p*2]; // 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 coints
        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[1 - value];//assign it
                }
            }
        }
        tempArray[i] = min; //assign min value to array of coins
    }
    return tempArray[p];
}

谁能帮我看看为什么这不起作用?该方法旨在获得代表硬币的值的输入,它具有无限数量的这些硬币来形成整数 p,该方法是返回用于到达 p 的最小硬币数量。

【问题讨论】:

    标签: java recursion dynamic-programming coin-change


    【解决方案1】:

    tempArray 在所有索引上初始化为 0。 使用 tempArray[1-value] 基本上给你 0。 因此,从 1 到 p 的所有索引的值都是 1 + tempArray[1-value] 这是 1。此外, tempArray[1-value] 是一个负索引。我想你的意思是 tempArray[i-value]

    【讨论】:

    • 太棒了,我刚刚将您提到的行从 1-value 更改为 i-value 并且它有效。你认为这现在是正确的吗?我也对逐行实际发生的事情感到困惑,请您给我一个简短的概述吗?
    • 如果你想知道有多少面额硬币 {1,2,3,4} 会你总共需要 10 个。代码从 1 开始,检查所需的最小硬币数量,然后是 2,然后是 3,依此类推。您可以将其视为将 10 拆分为 4+4+2,在 4 处的值为 1,在 8 处的值为 2,最后在 10 处的值为 3。您可以通过打印值来查看发生了什么每次迭代结束时的最小值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2023-03-02
    相关资源
    最近更新 更多