具体来说,问题的输入包括:
一个固定容量的背包(通常表示为一个整数W)。一组物品,每个物品有两个属性:重量(通常表示为一个整数weight)和价值(通常表示为一个整数value)。求解的目标是找到一种放置物品的方式,使得放入背包的物品的总重量不超过背包容量,并且总价值最大。这个问题的特点是,对于每件物品,你只能选择将其放入背包一次(0-1,因此称为“01背包”),或者不放入背包。不能将物品切割成更小的部分放入背包,要么整个物品放入背包,要么不放入。
动态规划解法:
定义状态: 通常使用二维数组dp[i][j]表示在前i个物品中,背包容量为j时的最大总价值。
状态转移方程: 考虑第i个物品,可以选择放入背包或者不放入。如果选择放入,那么总价值为dp[i-1][j-weight[i]] + value[i],即前i-1个物品的总价值加上当前物品的价值。如果选择不放入,那么总价值为dp[i-1][j],即前i-1个物品的总价值。因此,状态转移方程为:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])其中,dp[i-1][j]表示不放入第i个物品,dp[i-1][j-weight[i]] + value[i]表示放入第i个物品。
初始条件: 当i=0时,表示前0个物品,总价值为0;当j=0时,表示背包容量为0,总价值也为0。
遍历顺序: 外层循环遍历物品,内层循环遍历背包容量。
返回结果: 最终结果存储在dp[N][W]中,其中N为物品数量,W为背包容量。
例子:
假设有如下物品:
Copy code解释物品1:重量=2,价值=3物品2:重量=3,价值=4物品3:重量=4,价值=5物品4:重量=5,价值=6背包容量为W=8,我们要求解在这个条件下的最大总价值。
按照上述动态规划解法,构建状态转移表如下:
luaCopy code解释 重量/价值012345678 ---------------------------------------------- 物品0000000000 物品1003333333 物品200344777 10 物品300344788 11 物品400344789 11因此,最终结果为dp[4][8] = 11,表示在背包容量为8的情况下,最大总价值为11。这意味着最优解是选择物品2和物品4放入背包。
01.【模板】01背包题目