解决背包的变体,其中物品的价值取决于已经在袋子中的物品
Posted
技术标签:
【中文标题】解决背包的变体,其中物品的价值取决于已经在袋子中的物品【英文标题】:Solving a variation of the knapsack in which the value of an item depends on items that are already in the sack 【发布时间】:2015-08-04 21:52:18 【问题描述】:我正在尝试解决以下问题:
我有一组N
项目,其中每对项目都有一个相互得分,我需要选择W
项目的组合,使得总分最高。
以i,j,k
为例,项目的总分是
score(i,j) + score(i,k) + score(j,k).
为了避免遍历所有N^W
可能的组合,我考虑对0-1
背包问题做一个变体,并通过这两个变化用动态规划解决:
-
将所有权重设置为 1(所以最终我会在我的麻袋中得到准确的
W
物品)
我将根据当前正在检查的项目和当时已经在袋子中的项目“即时”计算值,而不是每个项目都有一个常量值数组。
我已经开始使用这两个更改编写解决方案,但是现在我考虑得更多,我担心它无法通过动态编程来解决,因为“最佳子结构”属性不成立。
比如W=3
和itemsi,j,k
是最优解,那么对于W=2
,i,j
不一定是最优解(根据上面的总分计算)。
有谁知道如何通过动态编程而不是O(N^W)
蛮力来解决这个问题?
谢谢
【问题讨论】:
你绝对可以用DP来保存所有的相互分数 【参考方案1】:您的问题是 NP-hard,这意味着几乎可以肯定没有快速的多项式时间算法来解决它,因为没有人能够提出多项式时间算法来解决 NP-hard 问题。要查看 NP 硬度,假设您有一个图表,其中节点是您的索引,并且如果 i 和 j 之间存在边,则将 i,j 之间的分数定义为 1,否则为 0。然后,如果可以,在多项式时间内,找到最多包含 W 个节点的节点的最大分数子集,然后您可以在多项式时间内确定图中是否存在大小为 W 的集团。这是一个 NP 完全问题。
【讨论】:
以上是关于解决背包的变体,其中物品的价值取决于已经在袋子中的物品的主要内容,如果未能解决你的问题,请参考以下文章