java - 计算一个数字的最大最佳面额组合

标签 java algorithm greedy

问题陈述:

我需要获得给定数字的最佳面额组合。 示例:我有三个面额 {50,25,10}给定的数字是 30 那么列表应该返回 <10,10,10> .对于数字 80,它应该返回 <50,10,10,10>因为剩下的 30 不能完全除以 25。 对于 35,它应该返回 <25,10> 75 <50,25> 对于 65 <50,10>

这有点类似于硬币问题,但我无法获得面额的值(value)。

引用 StackOverFlow Coin change DP solution to keep track of coins 到目前为止,这是我尝试过的:

public static int[] minChange(int[] denom, int changeAmount) {
    int n = denom.length;
    int[] count = new int[changeAmount + 1];
    int[] from = new int[changeAmount + 1];

    count[0] = 1;
    for (int i = 0; i < changeAmount; i++ )
      if (count[i] > 0)
        for (int j = 0; j < n; j++ ) {
          int p = i + denom[j];
          if (p <= changeAmount) {
            if (count[p] == 0 || count[p] > count[i] + 1) {
              count[p] = count[i] + 1;
              from[p] = j;
            }
          }
        }

    // No solutions:
    if (count[changeAmount] == 0)
      return null;

    // Build answer.
    int[] result = new int[count[changeAmount] - 1];
    int k = changeAmount;
    while (k > 0) {
      result[count[k] - 2] = denom[from[k]];
      k = k - denom[from[k]];
    }
    return result;
  }

如果值(value)完全可以被面额之一整除,这很有效,否则我根本不起作用。

最佳答案

一旦您在二维数组中找到了动态规划解的解,您就可以通过从末尾回溯数组 (arr[n][n]) 来找出最佳面额。

关于java - 计算一个数字的最大最佳面额组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43497589/

相关文章:

java - 您可以使用 Groovy 元编程来覆盖 Java 类上的私有(private)方法吗

C#:在 N x N 矩阵中查找最大 m 个元素的高效算法

algorithm - Haskell:FIFO队列算法复杂度

python - Python 中的正相异求和

java - 文本文件操作: Take data from text file and write a new text file with the data taken from the original file

java - 从 strings.xml 提供 layout_height 和 layout_width

java - 在 Weblogic 10.x.x 上使用 InitialContext 查找 EJB

algorithm - 拥有复杂到复杂的 2D FFT,如何进行 3D FFT?

algorithm - 子集和变化 : Get as many subset sums as possible

c - Do-While 循环正在工作,但没有得到最终输出