【发布时间】:2016-05-24 20:34:08
【问题描述】:
有没有办法逐步计算背包问题?任何近似算法?我正在尝试解决以下场景中的问题。
让 D 是我的数据集,它没有排序,也不应该排序。 D分为3个子集,即D1、D2和D3。如果需要,可以分别订购 D1、D2 和 D3。我想为集合 (D1,D2) 和 (D2,D3) 计算单独的背包解决方案,但我不想避免两次计算 D2。所以,基本上,我想:
- compute (D2) // 做一些操作
- 将其保存为中间结果
- 将其与 D1 一起使用并获得 (D1, D2) 的背包结果
- 将其与 D3 一起使用并获得 (D2,D3) 的背包结果
这样在 D2 上的数据遍历只进行一次。有没有办法像这样逐步解决背包问题?
【问题讨论】:
-
假设您的意思是 0/1 背包问题,是的。如果仅针对 D2 执行通常的 DP 解决方案,则记忆的部分结果适用于引导 (D2, D1) 或 (D2, D3) 的 DP 解决方案。要计算两者的解决方案,您需要复制仅 D2 计算的部分结果。我还没有准备好回答背包问题的其他变体。
-
感谢您的回复。是的,我的意思是 0/1 背包问题。据我所知,如果 (D2,D1) 的组合没有排序,那么组合 DP 的两个解决方案效率不高。在我的情况下,D1 和 D2 是单独排序的,集合 S = (D2 U D1) 或 S= (D2 U D3) 不一定是排序的。
-
我不确定您所说的“排序”是什么意思。 @JohnBollinger 所指的 DP 不关心元素的顺序,因此您无需对它们进行任何排序——您只需将 D2 中的元素移到前面即可。
标签: algorithm complexity-theory knapsack-problem approximation subset-sum