这篇文章是本人学习背包dp的阶段性总结,涵盖了本人的心路历程和思考:
总结一:枚举的方式及本质。
考虑状压dp。
当n比较小时(n <= 128),忽略是否合法,完全可以用一串二进制数字表示选择方案。
如:
当n = 7时,0001101即可表示选择了第1,3,4件物品(从右开始)。
而由于多数情况下,n > 128,导致使用状压会超过c/c++的最大范围__int128,即不能使用状压。
但这种枚举的思想,却是奠定了记忆化搜索的基础。
总结二:背包dp自记忆化搜索而生。
初学背包dp时,最先接触的一定是最经典的01背包:
记忆化搜索:运用递归的性质,枚举每一个物品,达到枚举所有情况,不重复不遗漏,并在枚举的过程中不断保留或更新所需值。
虽是递归面貌,实则线性本质。
总结三:背包dp是线性dp。
把n件物品按照从1到n排序,枚举i = [1,n],枚举从第1件到第i件共i件物品所有的合法情况,本题中指总体积不超过给定容积V,从而得到一级情况。
由于给定容积V所限,再对当前已装有总体积,枚举j = [V,0],枚举当前总体积为j时,对上述的一级情况进行分类,得到二级情况。
由于枚举的j = [V,0],所得到的二级情况,一定是合法且不重复不遗漏。
再对二级情况根据有无第i件物品,进行分类,得到三级情况。
由于三级情况全部来自于二级情况,而二级情况又全部合法,因此,所得到的三级情况,一定是合法且不遗漏不重复。
令maxv为一级情况(i):二级情况(j)的最值,那么maxv = max{三级情况} = max(三级情况:含第i件,三级情况:不含第i件) = max(max{三级情况:含第i件},max{三级情况:不含第i件})。
ps:上一段中的三级情况指一级情况(i):二级情况(j):三级情况,因过长而省略为三级情况。
那么maxv即为:[1,i]共i件物品,其所有的合法情况中,总体积为j时的最大价值。
三级情况:含第i件 = 一级情况(i - 1):二级情况(j - w[i]) + 第i件物品
三级情况:不含第i件 = 一级情况(i - 1):二级情况(j - w[i])
假设已知:max{一级情况(i - 1):二级情况}
maxv = max(max:一级情况(i - 1):二级情况(j),max:一级情况(i - 1):二级情况(j - c[i]) + w[i])
正如: