Dynamic 背包最大利润
共有4项:A砝码2LB的利润为40美元,B砝码5LB的利润为30美元,C砝码10LB的利润为50美元,D砝码5LB的利润为10美元。计算背包重量为16磅的4件物品中任何一件的最大总利润。你不能拿走一件物品的任何部分,只能拿走整个Dynamic 背包最大利润,dynamic,dynamic-programming,knapsack-problem,maximum-profit-problem,Dynamic,Dynamic Programming,Knapsack Problem,Maximum Profit Problem,共有4项:A砝码2LB的利润为40美元,B砝码5LB的利润为30美元,C砝码10LB的利润为50美元,D砝码5LB的利润为10美元。计算背包重量为16磅的4件物品中任何一件的最大总利润。你不能拿走一件物品的任何部分,只能拿走整个 请说明如何用背包问题的方法来解决上述问题。 < P>一个简单的解决方案是考虑项目的所有子集,并计算所有子集的总重量和值。然后,你应该只考虑那些重量小于或等于背包容量的子集。从所有这些子集中,选择最大值子集 考虑项目的所有子集,每个项目可以有两种情况: 该项包含在最佳子
请说明如何用背包问题的方法来解决上述问题。 < P>一个简单的解决方案是考虑项目的所有子集,并计算所有子集的总重量和值。然后,你应该只考虑那些重量小于或等于背包容量的子集。从所有这些子集中,选择最大值子集
考虑项目的所有子集,每个项目可以有两种情况:
- 该项包含在最佳子集中
- 该项不包括在最佳子集中
weight = {2, 5, 10, 5}
Capacity = 16
The recursion tree would look like:
// Here n,k -> items remaining, capacity remaining
// Going to left child -> including the item at hand
// Going to right child -> excluding the item at hand
_______4,16______
/ \
/ \
3,14 3,16
/ \ / \
/ \ / \
2,9 2,14 2,5 2,16
\ / \ \ / \
\ / \ \ / \__
1,9 1,4 1,14 1,5 1,6 1,16
/\ /\ /\ /\ / \
/ \ / \ / \ / \ / \
0,4 0,9 0,9 0,14 0,0 0,0 0,1 0,6 0,11 0,16
由于叶中存在重叠的子问题,我们可以使用动态规划来解决它。如果您存储了这些值,那么以后使用它们会很有效。这里匹配发生在叶节点中,如果您举其他示例,您将看到匹配可能发生在叶节点之前很远的地方
伪代码如下所示:
Procedure Knapsack(n, W): //here, n = number of items, W = capacity of Knapsack
for i from 0 up to n
for j from 0 up to W
if i == 0 or j == 0
table[i][j] :=0
else if weight[i-1] <= j
table[i][j] := max(profit[i-1] + table[i-1][w-weight[i-1]], table[i-1][j])
else
table[i][j] := table[i-1][j]
end if
end for
end for
Return table[n][W]
程序背包(n,W)://这里,n=物品数量,W=背包容量
对于从0到n的i
对于从0到W的j
如果i==0或j==0
表[i][j]:=0
否则,如果权重[i-1]投票结束,因为OP没有显示任何研究成果。