【发布时间】: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来保存所有的相互分数
标签: c++ algorithm dynamic-programming knapsack-problem