POJ-2184 (01背包的负数处理)

i TS[i] TF[i]
1 -5 7
2 8 -6
3 -2 3

如图所示,要求TS[i]和TF[i]的和最大,但是TS[i]的和不能为负数,TF[i]的和也不能为负数。输出最终的最大的和。
我们可以把他看成01背包的问题。我们可以假设TS[i]是正数,(其实也不用假设,即便为负数,我们也只是需要移动区间而已,从而使得TS[i]为正)。也就是求在花费TS[i]的基础上,获取的TF[i]的价值。
比如说下边这个例子:

TS[i] TF[i]
2 3
6 -7

我们可以写出dp[2]=3; dp[8]=4;就是这个道理,最后再把8+4=12就行了。
我们令dp[100000]=0,因为其他的值都有可能是负数,所以我们把其他的都赋值为负无穷。
以100000作为原点,这样dp括号里的容量就不会为负数了。

如同01背包一样,如果TS[i]是正数,则有如下循环:
for(i=0;i<n;i++)
   {
   
       if(TS[i]>0)
           for(j=200000;j>=TS[i];j--)
           dp[j]=max(dp[j],dp[j-TS[i]]+TF[i]);
}
如果是负数,则是:
for(i=0;i<n;i++)
   {
   
       if<
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值