动态规划 (三) 背包问题

问题描述


有n个物品,且每个物品都只有一个。物品i的体积为v[ i ],重量为w[ i ]。背包的体积为C,求怎样装载能使得背包里装的物品最重?

思路分析


之所以叫0-1背包问题,是因为所有的物品都只有一个,在选择物品装载到背包里的时候,只有两种选择:不装载或装载,对应计算机里的0(FALSE)和1(TRUE)的概念。我们用 dp[ i ][ j ] 表示“把前 i 个物品装到体积为 j 的背包中的最大总重量”。得状态转移方程:
dp[i][j] = max(dp[i-1][j], dp[i-1][j - v[i]] + w[i]);
其中,dp[ i - 1 ][ j ] 表示不把物品 i 装载进背包,所以背包的重量是前面 i-1 个的重量;后一项 dp[ i - 1][ j - v[ i ] ] + w[ i ] 表示若把第 i 个物品装载进背包,则必须由最优子问题得到,所以没装载 i 之前重量一定也是最大的。

我们发现循环的时候,这个转移方程是一个二维数组,且第 i 行取决于第 i -1行的值,因此初始化时,只要将第 0 行全部置为 0 即可,即 dp[ 0 ] [ j ] = 0;

代码示例


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值