再谈价值为负时动态扩展背包容量的合理性

//P1273 有线电视网-树上DP之树上分组背包_秦三马和他的CF生涯的博客-CSDN博客

该文章中解释了几点细节,但并没有说明为什么背包容量需要动态扩展,而且动态扩展还不会出错。

普通的01背包都是从总体积那里开始倒序枚举体积,而本题需要不停扩展,这里就涉及到价值的特殊性,本题价值是负数,也就是说,我们初始化时要把dp数组全部初始化为极小负数,如果我们从一个节点最多能容纳的体积开始枚举,当且仅当dp[now][i-k]+dp[j][k]-s[x].w

中的dp[now][i-k]已经被状态转移时,本次转移才具有合理性。那为什么不能像01背包那样呢,01背包之所以可以从最大体积开始倒序枚举,就因为它不转移时的价值情况是0。你不从最大开始转移,是会出错的

树上一个节点在遍历到一个儿子时,需要从前一个儿子的状态转移,如果前一个儿子该状态没有转移,那么这次也就不能通过这一状态进行转移。

即使把它变成正序二维枚举,当前一个物体状态并未被转移时,本物体也不应该被转移

第一个儿子时,其实父亲节点就完成了一次“复制”,把第一个儿子的情况通过dp[now][0]转移到自身。如果此时进行大于t的枚举,那么必须要父亲节点dp[now][j]  j>=1的情况,而那时根本就没有这种情况出现,仍处于初始状态。同理,多个儿子时,也是这样。

以第二个儿子为例最开始j=sum,它会被presum转移,j=sum-1,会被presum以及之前的一个转移,这些里面其实都包含了装有第一个儿子的情况,所以不用担心有的儿子没被大体积考虑到

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qinsanma and Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值