一种打包算法......种类

时间:2008-11-27 01:26:50

标签: algorithm np-hard computation

给定一系列项目,每个项目都有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是一个更便宜的选项,可达到最低价值。

3 个答案:

答案 0 :(得分:8)

这是背包问题。 (也就是说,这个问题的决定版本与背包问题的决策版本相同,虽然背包问题的优化版本通常有不同的说法。)它是NP难的(这意味着没有算法是已知的“大小”中的多项式 - 输入中的位数 - 。但是如果你的数字很小(输入中最大的“值”,比如说;成本无关紧要),那么就有一个简单的动态编程解决方案。

让最佳[v]为获得(精确)v值的最小成本。然后,您可以计算所有v的最佳值[](将所有最佳[v]初始化为无穷大):

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

然后查看最佳值[v],以获得您想要的最小值加上最大值;其中最小的将给你带来成本。

如果你想要实际的项目(而不仅仅是最低成本),你可以保留一些额外的数据,或者只查看最佳[]的数组并从中推断。

答案 1 :(得分:0)

编辑此答案因实际上不正确而被编辑。遵循这方面的建议只会对您造成伤害。

这实际上不是背包问题,因为它假定你不能包装更多的物品而不是某些容器中的空间。在你的情况下,你想找到最便宜的组合,填补空间,允许溢出可能发生。

我的解决方案,我不知道是最优的,但它应该非常接近,将为每个项目计算成本效益比,找到具有最高成本效益的项目并填写此项目的结构,直到没有空间再生一件物品。然后我会测试是否有任何其他可用项目的组合,可以填充可用的插槽,以减少一个最便宜的项目的成本,然后如果存在这样的解决方案,使用该组合否则再使用一个最便宜的物品。

Amenddum 这实际上也可能是NP完全的,但我还不确定。无论如何,出于所有实际目的,这种变化应该比天真的解决方案快得多。

答案 2 :(得分:0)

此问题称为整数线性编程。这是NP难的。 但是,对于像你的例子这样的小问题,只需要快速的几行代码就可以简单地强制购买选择的所有低组合,这是微不足道的。

NP-harddoes并不意味着不可能甚至昂贵,这意味着你的问题变得越来越慢,以解决更大规模的问题。在你只有三个项目的情况下,你可以在几微秒内解决这个问题。

关于什么是一般的最佳算法的确切问题..它上面有完整的教科书。一个好的开始是good old Wikipedia.