背包问题之退背包

背包问题之退背包

退背包就是从可选物品中删除其中一个物品,问满足所取总价值为 j j j 的方案数。

像普通背包一样,退背包先普通dp以下,然后退去所选物品。

对于01背包,假设 d p [ i ] dp[i]​ dp[i]为未退背包前满足所取总价值为 i i​ i 的方案数。 d p [ i ] dp'[i]​ dp[i] 为退去第 x x​ x个物品后满足所取总价值为 i i​ i的方案数,那么 dp方程为

  • i < w [ x ] i<w[x]​ i<w[x]时, d p [ i ] = d p [ i ] dp'[i]=dp[i] dp[i]=dp[i]
  • i w [ x ] i\ge w[x]​ iw[x]时, d p [ i ] = d p [ i ] d p [ i w [ x ] ] dp'[i]=dp[i]-dp'[i-w[x]]​ dp[i]=dp[i]dp[iw[x]]

代码表示:

for(int i=w[x];i<=m;++i) dp[i]-=dp[i-w[x]];

对于多重背包,假设 d p [ i ] dp[i] dp[i]为未退背包前满足所取总价值为 i i i 的方案数。 d p [ i ] dp'[i] dp[i] 为退去第 x x x个物品后满足所取总价值为 i i i的方案数,那么 dp方程为

  • i < w [ x ] i<w[x]​ i<w[x]时, d p [ i ] = d p [ i ] dp'[i]=dp[i]​ dp[i]=dp[i]
  • i w [ x ] i\ge w[x] iw[x]时, d p [ i ] = d p [ i ] d p [ i w [ x ] ] dp'[i]=dp[i]-dp[i-w[x]] dp[i]=dp[i]dp[iw[x]]

代码表示:

for(int i=m;i>=w[x];--i) dp[i]-=dp[i-w[x]];

不难看出,其实这就是普通背包DP过程的逆过程。

相关题目:

The Preliminary Contest for ICPC Asia Shanghai 2019 J. Stone game :传送门

全部评论

相关推荐

LXXXXd:有点杂,想搞自动化的话没必要把法律的经历写上去
点赞 评论 收藏
分享
11-04 19:05
已编辑
东莞城市学院 单片机
不知道怎么取名字_:你这个要实习两年?哪有这么久的,感觉就是即使你毕业了,但还按实习的话,是不是不用给你缴社保公积金啥的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务