【发布时间】:2015-10-18 19:38:01
【问题描述】:
我正在尝试使用递归来找到最小数量的硬币来达到给定的数量。我的代码能够列出所需的最少硬币数量,但我似乎找不到打印出用于提出解决方案的硬币的方法。我已经搜索并找到了类似的示例,但我似乎无法正确地将其应用于此。
这是我目前所拥有的:
import java.util.*;
public class Coins{
public static int findMinCoins(int[] currency, int amount) {
int i, j, min, tempSolution;
min = amount;
for (i = 0; i < currency.length; i++) {
if (currency[i] == amount) {
return 1;
}
}
for (j = 1; j <= (amount / 2); j++) {
tempSolution = findMinCoins(currency, j) + findMinCoins(currency, amount - j);
if (tempSolution < min) {
min = tempSolution;
}
}
return min;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] USA =
{1, 5, 10, 25, 50};
System.out.println("Please enter an integer amount.");
int amount = in.nextInt();
int minCoins = findMinCoins(USA, amount);
System.out.println("The minimum number of coins to make " + amount + " in United States currency is " + minCoins + ".");
System.out.println("The coins used were:");
/*Print coins used to find minCoins.*/
in.close();
}
}
目前运行的代码示例:
Please enter an integer amount.
17
The minimum number of coins to make 17 in United States currency is 4.
The coins used were:
如果有人能给我一些关于如何做到这一点的见解,将不胜感激。
【问题讨论】:
-
什么是可用的硬币?另外,尝试描述它应该如何工作 - 当前代码对于某些输入(例如 - 44)永远运行
-
关于质量的旁注:请考虑源代码中的命名。这很糟糕。首先,有约定;例如类名以大写开头。那么:一个名字应该说明它所命名的事物是关于什么的。所以,数字是一个数字,而价值是一个价值……嗯?对于实际问题,您可能希望在这里和那里开始使用 printlns ......只是为了打印中间结果;这可能会给你一个线索......在哪里以及如何添加相关的打印输出。
-
@chenchuk 可用的硬币可以是任何一组整数。对于我发布的代码,我只使用了 {1,5,10,25,50}。至于结果,它打印出字符串“以美国货币制作 17 的最小硬币数量为 4”。如果输入 17。我不确定如何在不使用动态编程的情况下以更高的值改进运行时。
-
@Jägermeister 好的,我在编辑中修复了一些质量问题,如果您发现任何其他问题,请随时纠正我,因为我正在努力使我的代码更清晰。至于添加 printlns,我尝试在第一个 for 循环中创建一个列表来存储 currency[i] 的每个值,但我在那里没有取得任何进展。除此之外,我已经花时间逐行调试,但我仍然不知道从哪里开始。
-
@Sigonious 您不需要使用递归,请参阅下面的答案。它有测试证明它有效。
标签: java algorithm recursion coin-change