导航菜单
首页 >  LeetCode真题讲解  > 算法沉淀

算法沉淀

在这里插入图片描述

算法沉淀——动态规划之01背包问题01.【模板】01背包02.分割等和子集03.目标和04.最后一块石头的重量 II 01背包问题是一类经典的动态规划问题,通常描述为:有一个固定容量的背包,以及一组物品,每件物品都有重量和价值,目标是找到在背包容量范围内,使得背包中的物品总价值最大的组合。

具体来说,问题的输入包括:

一个固定容量的背包(通常表示为一个整数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背包

题目

相关推荐: