动态编程 - 给定总和所需的最小硬币数

时间:2017-11-30 04:52:11

标签: java dynamic-programming coin-change

在研究硬币变化问题后,我尽力实施解决方案。到目前为止我的代码打印了给定金额所需的最小硬币数量。但是,它不会打印出所需的每个硬币面额的数量。这就是我的代码目前的样子:

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 [] []。任何帮助将不胜感激! (这是我在这里发表的第一篇文章,如果你贬低,你至少可以告诉我我做错了什么吗?我只是想学习。)

2 个答案:

答案 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 ProgrammingThe dynamic programming alogorithm for CMP (change making problem)。这两个参考文献都提供了通用的动态编程算法。