01背包(物品只有选和不选两个状态,每个物品只能选择一次)
-
判断背包容量指的什么?
capacity
(不超过背包容量的最大价值,也就是说背包容量是所有物品重量的最大值) -
判断物品(n个)重量和价值指的什么?
weight[i]
、value[i]
-
表达式:容量
j
变化范围:[weight[i]------capacity]dp[n][capacity+1]
当前
j
容量对应的对物品i
最大价值选择:dp[i][j]
=max(不拿第i个物品的价值,拿第i个物品的价值)-
拿第i个物品的价值:
dp
[i-1]
[j-weight[i]]+value[i]
(第i个物品的价值+(总容量-第i个物品的重量)的最大价值 )dp[i-1][j-weight[i]]
表示的是在背包容量为j-weight[i]时,前i-1个物品的最大总价值。 -
不拿第i个物品的价值
:dp[i-1][j]
(也就是只拿前i-1个物品的价值)
-
-
最后返回结果:
dp[n-1][capacity]
完全背包(每个物品数量无限)
-
其他同上
-
//(只做分析用)判断每个物品个数的上限:
k<=j/weight[i]
-
表达式:
dp[i][j]=max(dp[i-1][j],dp
[i]
[j-weight[i]]+value[i])
(max(不拿第i物品,拿完一件第i物品剩余容量对应的最大价值+拿一件i物品)) -
与01背包的区别:剩余容量对应的最大价值包括第i个物品在内。