背包问题

39 篇文章 1 订阅
34 篇文章 1 订阅

01背包

01背包,他名字的来源就是有两种概念,选和不选,所以叫01背包。

这种背包的大致题目是:
有N件物品和一个容量为V 的背包。放入第i件物品耗费的空间是Ci,得到
的价值是Wi。求解将哪些物品装入背包可使价值总和最大。

这就是最基础的背包问题。

用子问题定义状态:即dp[i, v]表示前i件物品恰放入一个容量为v的背包可以
获得的最大价值。则其状态转移方程便是:

dp[i][j]=max(dp[i][j],dp[i-1][j-a[i]]+b[i]);

这个方程就是背包问题的核心。

例题及讲解

完全背包问题

完全背包问题,和01背包一样的是每种物品有一个重量及一个价值,但每种物品的数量是无限的。
这就增加了这种问题的难度

题目大致是这样的:有N种物品和一个容量为V 的背包,每种物品都有无限件可用。放入第i种
物品的耗费的空间是Ci,得到的价值是Wi。求解:将哪些物品装入背包,可使
这些物品的耗费的空间总和不超过背包容量,且价值总和最大。

我们可以沿用01背包的思路,令dp[i, v]表示前i种物品恰放入一个容量为v的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程:

dp[i][j]=max(dp[i-1][j],dp[i-1][j-k*a[i]]+k*b[i]);

完全背包问题差不多就是这样的了,例题及讲解

混合背包

混合背包,又称多重背包,相当于是杂糅了01背包和多重背包的升级版,难度更大。

题目的大致样貌:有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费
的空间是Ci,价值是Wi。求解将哪些物品装入背包可使这些物品的耗费的空间
总和不超过背包容量,且价值总和最大。

这种题和完全背包问题很类似。基本的方程只需将完全背包问题的方程略
微一改即可。

状态转移方程:

dp[i][j]=max(dp[i][j],dp[i-1][j-k*a[i]]+k*b[i]);

压缩

正如刚才大家看到的,所有的状态转移方程都是用的2维的dp数组,接下来我要讲解的就是将二维的dp数组压成一维的方法,这种方法叫做滚动数轴

在这里插入图片描述
简单地说就是通过后面的把前面的推出来再swap交换。
前面的例题都是用压缩方法做的,请读者们自行阅读(作者懒得一批)。
作者会持续更新其他几种背包。

…未完待续

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值