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

编写一个可以使用适当的数据结构“做出改变”的Java程序?

孟栋
2023-03-14

我有一个作业,我不知道如何解决它被要求这样做。

我不是要你解决整个问题!所以不要一看到“作业”这个词就不投赞成票。

这是一门关于数据结构与算法的课程,它说用合适的数据结构来解决问题。首先,我将作业复制到这里:

编写一个可以“做出改变”的Java程序。您的程序应该将两个数字作为输入,一个是收取的货币金额,另一个是给定的货币金额。然后,它应该返回每种纸币和硬币的号码,作为所给金额和所收费用金额之间的差额的零钱返还。分配给纸币和硬币的价值可以以任何现任或前任政府的货币制度为基础。尝试设计您的程序,使它返回的纸币和硬币数量尽可能少。

如果我没有理解错的话,我们必须编写一个程序,可以用最少的纸币和硬币来计算要还的钱的数量。

我们到目前为止只学习了堆栈、队列和链表,但我不知道如何使用这些数据结构中的一种来解决这个赋值。

哪种数据结构适合解决这样的问题?为什么?

共有2个答案

汪典
2023-03-14

这里有一个寻找最佳解的算法。基本上,它遍历所有可能的面额,寻找最短的变化值列表。

// How many cents in a dollar.
private static final int DOLLARS = 100;
// In cents.
private static final int[] denominations = {
    // $100
    100 * DOLLARS,
    // $50
    50 * DOLLARS,
    // $20
    20 * DOLLARS,
    // $10
    10 * DOLLARS,
    // $5
    5 * DOLLARS,
    // $2
    2 * DOLLARS,
    // $1
    1 * DOLLARS,
    // 50c
    50,
    // 25c
    25,
    // 5c
    5,
    // 1c
    1
};

private List<Integer> makeChange(int value) {
    // Null means none found so far.
    List<Integer> change = null;
    System.out.println("Make change for " + value);
    // For all denomination.
    for (int i : denominations) {
        // that is less than the value
        if (i <= value) {
            // Build a new candidate.
            List<Integer> newChange = new LinkedList<>();
            // Remember it.
            newChange.add(i);
            // If we are at zero we're done.
            if (i < value) {
                // Make change from the remaining value.
                List<Integer> theRest = makeChange(value - i);
                if (theRest != null) {
                    // Gode more.
                    newChange.addAll(theRest);
                }
            }
            // Is it shorter?
            if (change == null || newChange.size() < change.size()) {
                // Better.
                change = newChange;
                System.out.println("Better change for " + value + " = " + change);
            }
        }
    }
    return change;
}

使用26这样的低数字进行尝试将在合理的时间长度内获得良好的结果。在10+美元关口附近,它将会很挣扎,因为它必须列举每一个排列的所有可能的子排列--即使它以前见过它们。

如果允许我们使用映射,我们可以通过记住以前的最佳计算(称为Memoisation)来改善问题。这一个可以处理更大的数字,因为它从来不需要重新计算任何数字的最佳变化。

// All the best lists I've seen so far.
Map<Integer, List<Integer>> memory = new HashMap<>();

private List<Integer> makeChangeUsingMap(int value) {
    // If we've seen this one before, use it.
    if (memory.containsKey(value)) {
        return memory.get(value);
    }
    // Null means none found so far.
    List<Integer> change = null;
    System.out.println("Make change for " + value);
    // For all denomination.
    for (int i : denominations) {
        // that is less than the value
        if (i <= value) {
            // Build a new candidate.
            List<Integer> newChange = new LinkedList<>();
            // Remember it.
            newChange.add(i);
            // If we are at zero we're done.
            if (i < value) {
                // Make change from the remaining value.
                List<Integer> theRest = makeChangeUsingMap(value - i);
                if (theRest != null) {
                    // Gode more.
                    newChange.addAll(theRest);
                }
            }
            // Is it shorter?
            if (change == null || newChange.size() < change.size()) {
                // Better.
                change = newChange;
                System.out.println("Better change for " + value + " = " + change);
                // Remember it.
                memory.put(value, change);
            }
        }
    }
    return change;
}
东门新立
2023-03-14

我会用地图。例如,75名代表如下:

100 -> 0
 50 -> 1
 20 -> 1
 10 -> 0
 5  -> 1
 ...
0.01 ->0

意思是零百张钞票、五十张钞票中的一张等等。

 类似资料:
  • 问题内容: 我在弄清楚动态硬币更换问题的最后代码方面遇到麻烦。我已包含以下代码。 我不知道最后一个。那时候应该只使用贪婪算法,还是可以根据表中已有的值计算答案?我一直在努力理解这个问题,我认为我已经很接近了。该方法通过创建表并使用存储在表中的结果来解决较大的问题而无需使用递归来找到进行一定量更改所需的最小硬币数量。 问题答案: 您不需要切换到贪婪算法来解决硬币兑换问题,您可以使用动态编程算法来解决

  • 是否可以实现一个一旦有答案就停止处理流的收集器? 例如,如果收集器正在计算平均值,其中一个值是NaN,我知道答案是NaN而没有看到更多的值,因此进一步的计算是没有意义的。

  • 问题内容: 如何正确使用Javadoc? 我的意图是拥有一个带有抽象方法的抽象类。这些方法具有javadoc注释。现在,如果我扩展了抽象类,则将覆盖这些方法并要使用。 但对于所有的参数,可以如用于该链接似乎没有工作时。Eclipse仍然抱怨。 那么我该如何使用呢? 问题答案: 为了包括超类的文档,您不应使用not 。 然后,您将获得超类的文档。您可以添加它,并且可以覆盖诸如和所需的东西。

  • 现在,你对Python 编程语言处理自然语言的能力已经有了体会。不过,如果你是Python或者编程新手,你可能仍然要努力对付Python,而尚未感觉到你在完全控制它。在这一章中,我们将解决以下问题: 怎么能写出结构良好、可读的程序,你和其他人将能够很容易的重新使用它? 基本结构块,如循环、函数以及赋值,是如何执行的? Python 编程的陷阱有哪些,你怎么能避免它们吗? 一路上,你将巩固基本编程结

  • 我正处于学习Java的开始阶段,并且有一个作业正在为我提供一些困难(我假设实际上并不困难)。 说明如下: “在一个名为MathCompations的类中,编写一个名为findMin的方法,该方法接受三个整数作为参数并返回三个值中最小的一个。例如,调用findMin(1,10,-1)将返回-1。您必须使用Math类min函数(它只接受2个参数)。在类中编写一个主方法,调用findMin(5,7,3)

  • 为了理解何时会需要使用结构体,让我们编写一个计算长方形面积的程序。我们会从单独的变量开始,接着重构程序直到使用结构体替代他们为止。 使用 Cargo 来创建一个叫做 rectangles 的新二进制程序,它会获取一个长方形以像素为单位的宽度和高度并计算它的面积。示例 5-8 中是项目的 src/main.rs 文件中为此实现的一个小程序: 文件名: src/main.rs 示例 5-8:通过分别指