背包问题体积限制的类型与空间优化问题

根据常见的背包问题中体积的不同限制可以划分为以下三种常见的类型,他们的状态表示既有联系又有区别,这里所说的体积在一维的时候可以表示为背包容量,二维的时候可以表示花费的费用1和费用2,也即背包容量和背包重量的限制:

① 体积不超过j(也即体积至多是j),初始化的时候全部元素为0,并且在状态计算的时候体积需要大于等于0;

② 体积恰好是j,初始化的时候f[0] = 0,f(i) = ∞,并且在状态计算的时候体积需要大于等于0

③ 体积至少是j,初始化的时候f[0] = 0,f(i) = ∞,在状态计算的时候体积可以是负数,我们可以将j - v < 0的状态转移到f[0]这个状态,这样当j - v < 0的时候满足当前dp[j]的体积至少是j的状态定义。acwing的1020潜水员是一道经典的体积至少为j求解最优值的题目。其实在状态定义的时候对于"不超过"的题目我们可以将其定义为"恰好",最终枚举一遍体积求解最大值即可,有的时候状态定义为"恰好"会更加好处理。例如11题背包问题求方案数的题目中要求的是不超过体积v....的...,其实为了方便处理定义的是"恰好",最后枚举一遍体积求解最大值也是可以的。

很多时候我们都可以将背包问题中的空间优化掉一维,最常见的是二维dp数组优化为一维dp数组,将二维优化为一维主要是做相应的等价变形,这个时候需要参考状态转移方程,根据状态转移方程中使用到的是当前这一层循环计算的状态还是上一层循环的状态,如果使用到的是上一层的状态那么则需要逆序遍历体积这样可以保证当前这一层的j - v状态是没有计算过的,而比j这个状态之后计算得到的,所以当逆序遍历体积之后当前的dp[j] += dp[j - v]中的dp[j - v]其实是上一层的状态,最经典的是零一背包问题与完全背包问题二维优化为一维的情况之后逆序遍历与顺序遍历的情况。如果我们需要求解具体的方案一般不使用空间优化(比较常见的是二维数组优化为一维数组),因为在求解方案的时候需要使用到上一个状态或者下一个状态的值这个时候使用二维数组记录才可以判断出对应的状态,根据对应的状态才可以进行反推。

如何求解最优方案的方案数目呢?其中一道比较经典的题目11题,具体的做法是使用一个额外的数组来记录对应状态的方案数目,dp数组用来记录最优解,另外的一个辅助数组用来记录对应状态的方案数目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值