关于背包dp的思考

本文作者分享了学习背包动态规划(dp)的经验,包括枚举思路与记忆化搜索的关系,以及01背包问题的递归本质。文章指出,背包dp本质上是线性dp,通过逐个物品枚举构建各级情况,确保合法且不重复。作者详细阐述了如何从一级到三级情况逐步求解最大价值,提供了一个清晰的理解框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章是本人学习背包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])

正如:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值