鉴于物品的阵列,其每个具有一个valuecost,的什么是最好的算法确定在最小的成本达到最小值所需的项例如:

Item: Value -> Cost
-------------------
A     20   -> 11
B     7    -> 5
C     1    -> 2

MinValue = 30
naive solution: A + B + C + C + C. Value: 30, Cost 22
best option: A + B + B.            Value: 34, Cost 21

请注意整体价值:成本比率在年底是无关紧要的(A + A会给你资金的最佳价值,但A + B + B是打最小值一个便宜的选择)

有帮助吗?

解决方案

这是背包问题。 (也就是说,这个问题的判定型是一样的背包问题的决定版本,虽然背包问题的优化版本,通常有不同说明。)它是NP难的(这意味着没有算法称为是多项式中的“尺寸” - 位的数目 - 在输入)。但是,如果你的号码是小(在输入最大的“价值”,说;成本并不重要),然后有一个简单的动态编程解决方案

让最好[V]是最小的成本获得的(完全一致)的值V,那么就可以计算出值最好[]对于所有V,由(初始化所有最好的[V]为无穷大并且):

best[0] = 0
best[v] = min_(items i){cost[i] + best[v-value[i]]}

然后找高达你想要的最小值加上最大值值充其量[V]最小的那些会给你的成本。

如果你想实际项目(而不仅仅是成本最低),你可以保持一定的额外的数据,或者只是通过看最好的[]里的阵列,并从中推断。

其他提示

此问题被称为整数线性规划。这是NP难问题。 然而,对于像你的榜样的小问题,是微不足道的做的代码快速几行简单蛮力的购买选择所有低的组合。

NP-harddoesn't意味着不可能或甚至昂贵,这意味着您的问题迅速变慢具有较大规模的问题需要解决。在你的情况只有三个项目,你可以在短短微秒解决这个问题。

有关的什么一般最好的算法确切的问题..还有它整个的教科书。一个良好的开端是好老维基百科。

修改此答案是删节上帐户的是事实不正确。继在这个建议只会造成你的伤害。

这是不实际的背包问题,因为它假设你不能容纳更多的物品之外还有空间在某些容器。在你万一你要发现将填补的空间最便宜的组合,让一个事实,即可能发生溢出。

我的解决方案,我不知道是最佳的,但它应该是相当密切的,是计算每个项目的成本效益比,发现最高的成本效益的项目,这个项目直到填满结构没有多一个项目的空间。然后,我会测试一下,看看是否有任何其他可用项目的组合,可以填充可用插槽少了那种最便宜的项目之一的成本,那么如果这样的解决方案存在,使用该组合以其它方式使用多个最便宜的物品。

Amenddum 的这实际上也是NP完全问题,但我还没有确定。无论如何对于所有的实际目的来说,这变化应该比幼稚溶液快得多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top