我正在尝试使用java硬币更改问题来枚举为n提供的所有可能的更改集。
我的逻辑如下:
while n >= denom m {
array[]+= denom m
n-= denom m
}
list.add[array[]]
return coinChanger(++denom)
我的代码:
public List<Integer> makeChange(int change) {
int[] denominations;
denominations = new int[]{1, 5, 10, 25};
return changeMaker(change, denominations, 0);
}
public List<Integer> changeMaker(int change, int[] denominations, int index) {
List<Integer> resultsList = new ArrayList<Integer>();
int[] resultDenom;
resultDenom = new int[4];
if (change <= 1) {
return resultsList;
}
while (change >= denominations[index]) {
resultDenom[index] += denominations[index];
System.out.println("ResultsDenom: " + resultDenom[index]);
change -= denominations[index];
}
resultsList.add(resultDenom[index]);
for (int val : resultDenom) {
System.out.println(val);
}
if (change > denominations[index]) {
return changeMaker(change-=denominations[index], denominations, ++index);
}
return resultsList;
}
这只输出一组所有枚举:
输出:
27
0
0
0
RESULT CHANGE PERMUTATIONS LIST: [27]
问题:
我很难弄清楚一旦其中一个完成后如何移动到下一个面额......我知道你应该转移到面额数组中的下一个指数......但是那只会添加下一个硬币...如何让它添加下一个最大的硬币,然后递归下降到下一个硬币......一直到所有4个硬币?
谢谢!
*的 修改 **
public List<Integer> makeChange(int change) {
int[] denominations;
denominations = new int[]{25, 10, 5, 1};
return changeMaker(change, denominations, 0);
}
public List<Integer> changeMaker(int change, int[] denominations, int index) {
List<Integer> resultsList = new ArrayList<Integer>();
int[] resultDenom;
resultDenom = new int[4];
if (change <= 1) {
return resultsList;
}
if (index > 3) {
return resultsList;
}
//if 27 >= 25
if (change >= denominations[index]) {
//[+25, 0, 0, 0]
resultDenom[index] += denominations[index];
//{ LIST } <--- [25, 0, 0, 0]
//List now contains { [25, 0, 0, 0], }, still need all other permutations
resultsList.add(resultDenom[index]);
//27 - 25,
return changeMaker(change-=denominations[index], denominations, ++index);
}
return resultsList;
}
渴望输出:列表清单...... 27美分:
LIST{ [1, 0, 0, 2], [0, 2, 1, 2], [0, 1, 3, 2]... etc}
答案 0 :(得分:5)
最简单的解决方案是在每个步骤中递归到两个变体(如果你还没完成):
应该是这样的:
public class Coins {
static final int[] DENOMINATIONS = {25, 10, 5, 1};
public static void change(int amount) {
change(amount, new ArrayList<Integer>(), 0);
}
private static void change(int remaining, List<Integer> coins, int pos) {
if (remaining == 0) {
System.out.println(coins);
} else {
if (remaining >= DENOMINATIONS[pos]) {
coins.add(DENOMINATIONS[pos]);
change(remaining - DENOMINATIONS[pos], coins, pos);
coins.remove(coins.size() - 1);
}
if (pos + 1 < DENOMINATIONS.length) {
change(remaining, coins, pos + 1);
}
}
}
}
如果您想收集列表,您需要复制添加硬币的列表(而不是在通话后退出)。
答案 1 :(得分:-1)
对于您要解决的问题,您的代码似乎有点费解
尝试实现此伪代码
getChange(int totalCents)
{
if (totalCents > 25)
{
print "25";
getChange(totalCents - 25);
}
else (totalCents > 10)
{
// same for 10
}
else (totalCents > 5)
{
// same for 5
}
else
{
// print out number left as pennies
}
}
您可以使用数组索引和for循环轻松替换带有硬编码值的if语句,然后使用希望记录值进行打印。我希望有所帮助。