在研究硬币变化问题后,我尽力实施解决方案。到目前为止我的代码打印了给定金额所需的最小硬币数量。但是,它不会打印出所需的每个硬币面额的数量。这就是我的代码目前的样子:
public class Coins {
static int minCoins(int coinValues[], int m, int target) {
int[] totalCoins = new int[target + 1];
int[][] numOfCoins = new int[target + 1][m];
totalCoins[0] = 0;
for (int i = 1; i <= target; i++) {
totalCoins[i] = Integer.MAX_VALUE;
}
for (int i = 1; i <= target; i++) {
for (int j = 0; j < m; j++) {
if (coinValues[j] <= i) {
int previous = totalCoins[i - coinValues[j]];
if (previous != Integer.MAX_VALUE && previous + 1 < totalCoins[i]) {
totalCoins[i] = previous + 1;
}
}
}
}
return totalCoins[target];
}
public static void main(String args[]) {
int coinValues[] = {1, 5, 10, 20};
int m = coinValues.length;
int target = 26;
System.out.println("Minimum coins required is "+ minCoins(coinValues, m, target) );
}
}
我很困惑我应该如何/在哪里填充numOfCoins [] []。任何帮助将不胜感激! (这是我在这里发表的第一篇文章,如果你贬低,你至少可以告诉我我做错了什么吗?我只是想学习。)
答案 0 :(得分:0)
我在Groovy中使用欧元面额实现的解决方案
class coinage {
def denoms = [1, 2, 5, 10, 20, 50, 100, 200]
def resultArray = []
def remainder
def largest
def newResult
def calculate(int amt) {
def value = denoms.findAll({ element -> element <= amt})
largest = value.last()
resultArray.add(largest)
remainder = amt - largest
if (remainder == 0 || remainder == amt) {
newResult = resultArray.size()
println("Minimum number of coins required for this is: $newResult")
} else
calculate(remainder)
}
}
并称之为:
coins = new coinage()
coins.calculate(305)
答案 1 :(得分:0)
@ user1523236提供了无法解决一般情况的贪婪方法。例如,如果一个人删除了1面额并计算出8的面额。
例如,请查看4.12. Dynamic Programming或The dynamic programming alogorithm for CMP (change making problem)。这两个参考文献都提供了通用的动态编程算法。