【发布时间】: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 问题是,我需要计算给定数字的最佳整除面额。希望这会有所帮助!