背包算法变异

时间:2013-11-26 09:36:45

标签: algorithm dynamic-programming knapsack-problem

我遇到了以下问题:

有一组项目,每个项目都有2个不同的正值A和B.

背包有两个值:totalA和totalB。这是所选项目的值A和B的最大总和。

我必须知道,背包可以容纳的最大物品数是多少。

示例:

输入:

总计A:10,总计B:15

item1 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)

我应该如何使用动态编程来解决这个问题?

3 个答案:

答案 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 > waitem[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 <= waitem[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

注意:您可以在递归解决方案上使用哈希表实现,这将阻止三维数组。