algorithm - 一种打包算法......有点

标签 algorithm np-hard computation

给定一个项目数组,每个项目都有一个成本什么是最好的算法来确定达到最小值所需的项目最低成本? 例如:

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

请注意,最后的整体值(value):成本比率是无关紧要的(A + A 会给你最好的性价比,但 A + B + B 是一个更便宜的选择,达到最小值)。

最佳答案

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

让 best[v] 成为获得(准确)v 值的最小成本。然后您可以计算所有 v 的值 best[],方法是(将所有 best[v] 初始化为无穷大并且):

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

然后查看 best[v] 的值,直到您想要的最小值加上最大值;最小的那些会给你成本。

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

关于algorithm - 一种打包算法......有点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/322699/

相关文章:

algorithm - 要添加到数组中使其中位数等于x的最小元素数

algorithm - 证明 TSP 度量的近似

algorithm - 您如何称呼描述列表包含重复项程度的列表的属性?

python - 在Python中处理大二项式的求和

algorithm - 考虑时间复杂度时,Theta(n) 和 T(n) 有什么区别?

java - 如何创建简单的扑克手牌算法?

database - 索引许多文档以启用支持 AND/OR 操作的查询

complexity-theory - NP-complete 的复杂度测量

python - Numpy:计算中的屏蔽元素

r - 根据 R 中另一个数据帧的索引创建一个新数据帧