【问题标题】:Calculate the largest best combination of denominations for a number计算一个数字的最大面值组合
【发布时间】:2017-04-19 13:45:37
【问题描述】:

问题陈述:

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

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

参考 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;
  }

如果价值完全可以被一个面额整除,这很好用,否则我根本不起作用。

【问题讨论】:

  • 问题是什么?
  • 65 不应该是 吗?
  • 这个问题的一般情况是NP-Hard
  • @ControlAltDel 我不好,65 应该是 。谢谢!!
  • @RobinTopper 问题是,我需要计算给定数字的最佳整除面额。希望这会有所帮助!

标签: java algorithm greedy


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2021-08-16
    相关资源
    最近更新 更多