我遇到了以下问题:
有一组项目,每个项目都有2个不同的正值A和B.
背包有两个值:totalA和totalB。这是所选项目的值A和B的最大总和。
我必须知道,背包可以容纳的最大物品数是多少。
示例:
输入:
总计A:10,总计B:15item1 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)
我应该如何使用动态编程来解决这个问题?
答案 0 :(得分:2)
这被称为“多重约束背包问题”(MKP,偶尔呈现为d-KP)。它可以在假多项式时间内解决,就像常规的背包问题一样,但你需要一个二维表而不是一个。
答案 1 :(得分:1)
将m [i,wa,wb]定义为最大值(此处的项目数),可以通过a
s小于或等于wa
之和得到b
的{{1}}小于或等于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
答案 2 :(得分:1)
这是一个可能对你有帮助的递推方程式: -
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
注意:您可以在递归解决方案上使用哈希表实现,这将阻止三维数组。