动态规划背包问题

本文介绍了动态规划在解决背包问题中的应用。动态规划通过构建二维数组dp,分析每个物体是否能放入背包,从而找到在不超过背包承重情况下能携带的最大价值。错误分析举例说明了直接累加重量可能导致超重的问题,提出了状态转移方程dp[i][w]=dp[i-1][w]或dp[i-1][w-a[i]],并给出了初始条件。
摘要由CSDN通过智能技术生成

动态规划背包问题

问题大多如下
  • 一个背包总沉重固定为多少kg
  • 有一堆物品,每个物品都有价格和重量
  • 在不撑爆背包的情况下,能装走的最多物品的价格或者重量

例题如下

在这里插入图片描述
背包问题开的数组一般都和背包的总承重有关
题解:

  • 对于每个物体,需要知道是否能拼出重量w([0,m])
  • 对于最后一个物体,看它是否可以进入背包
  • 如果除了最后一个物体,其他物体能拼出重量w,或者其他物体能拼出w-a[n-1],即最后一个物体拿与不拿的时候能拼出的重量.
  • [0,m]中能拼出的最大重量即为能带走的最大重量
问题分析
  • 算知道前n个物体能不能拼出w([0,m])//[0,m]用一个维度的数字表示
  • 需要知道前n-1个物体能不能拼出w[0,m]
  • 子问题
  • dp[i][w] 表示前i个物体能否拼出w,w的取值为[0,m]

一种常见的错误分析方式

用dp[i]表示前i个物体能拼出的最大重量(不超过target,即背包的最大重量),dp[i+1]能拼出的最大重量为dp[i]+a[i],即前i个物体能拼出的最大重量加上当前物体的重量.

  • [3,9,5,2] target=10;
  • 前三个物体能拼出来的最大重量为9
  • 前四个物体能拼出来的最大重量不是用前三个物体的最大重量+当前重量,9+2=11>target;而是3,5,2;所以不能用dp[i]去递推dp[i+1];两者不存在状态切换.

状态转移

dp[i][w] =dp[i-1][w] or dp[i-1][w-a[i]]
第二个表示:前i-1个物体能否装下除了当前的物体的重量.
第二个时候 w>=a[i]必须成立
初始条件 dp[0][0]=true; dp[0][1-m]=false;
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值