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

博客探讨了如何解决POJ-2184问题,即在确保TS[i]和TF[i]之和为正数的前提下,最大化它们的和。文章通过将问题转化为01背包问题进行分析,讨论了负数处理的特殊情况,解释了为什么在TS[i]为负时需要正序循环,并提供了计算过程和最终的解决方案。
摘要由CSDN通过智能技术生成
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<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值