背包算法变体
Posted
技术标签:
【中文标题】背包算法变体【英文标题】:Knapsack algorithm variation 【发布时间】:2013-11-26 09:36:44 【问题描述】:我遇到了以下问题:
有一组项目,每个项目有2个不同的正值A和B。
背包有两个值:totalA 和totalB。这是所选项目的值 A 和 B 的最大总和。
我必须弄清楚,背包最多可以容纳多少物品。
示例:
输入:
总A:10,总B:15
项目1 A:3,B:4
项目2 A:7,B:2
项目 3 A:1, B:9
项目 4 A:2, B:1
项目 5 A:4, B:6
输出:
3(项目:2、3、4)
我应该如何使用动态规划来解决这个任务?
【问题讨论】:
可能重复 ***.com/questions/14103846/… 或 ***.com/questions/14137267/… 您链接的帖子包含经典背包问题的答案,其中每件物品都有其重量和价值。在我的情况下,项目没有值,但它们有两个权重。 【参考方案1】:这被称为“多重约束背包问题”(MKP,有时呈现为 d-KP)。它可以像常规背包问题一样在伪多项式时间内解决,但您需要一个二维表而不是一个。
【讨论】:
【参考方案2】:将 m[i,wa,wb] 定义为最大值(此处的项目数),可以通过 a
s 的总和小于或等于 wa
和 b
的总和来获得s 小于或等于 wb
,使用最多 i
的项目。
m[i,wa,wb] = m[i-1,wa,wb]
如果item[i].a > wa
或item[i].b > wb
或
m[i,wa,wb] = max (m[i-1, wb, wb], m[i-1, wa - item[i].a, wb - item[i].b] + 1)
如果item[i].a <= wa
和item[i].b <= wb
【讨论】:
【参考方案3】:这是一个可能对您有所帮助的递归方程:-
if(Items[N].b<=Wa && Items[N].b<=Wa)
Value(N,Wa,Wb) = max(1+Value(N-1,Wa-Items[N].a,Wb-Items[N].b),Value(N-1,Wa,Wb))
else Value(N,Wa,Wb) = Value(N-1,Wa,Wb)
Where Wa = Current capacity of A sack & Wb of B sack
N = no of items considered
注意:您可以在递归解决方案中使用哈希表实现,这将防止三维数组。
【讨论】:
以上是关于背包算法变体的主要内容,如果未能解决你的问题,请参考以下文章