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交换。
前面的例题都是用压缩方法做的,请读者们自行阅读(作者懒得一批)。
作者会持续更新其他几种背包。
…未完待续