HDU2184 Cow Exhibition

本文介绍了一种通过将负数和正数牛群的S和F值转换为01背包问题来解决组合优化问题的方法。通过调整数值范围和动态规划算法的应用,有效地寻找满足特定条件的最大总价值组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:每头牛有一个S值,F值。取几只牛,使这几只牛∑S和∑F大于0的条件下,∑S+∑F最大。


可以转化为01背包问题。S看做重量,F看做价值。由于S可能为负值,把数轴左移100000,以dp[100000]作为原点。最后从dp[100000]开始,dp[i]>0的即满足第一个条件,再找最大值。特别注意在s[i]为负值时从小到大遍历。


#include <cstdio>
#include <cstring>
const int MAX1=200010;
int dp[MAX1];
int s[108],f[108];
int main()
{
    int N,i,j,ans;
    scanf("%d",&N);
    for(i=1;i<=N;i++)
        scanf("%d%d",s+i,f+i);
    for(i=0;i<=200000;i++)
        dp[i]=-3000000;
    dp[100000]=0;
    for(i=1;i<=N;i++)
        if(s[i]>0)
        {
            for(j=200000;j>=s[i];j--)
                if(dp[j]<dp[j-s[i]]+f[i])
                    dp[j]=dp[j-s[i]]+f[i];
        }
        else
        {
            for(j=0;j<=200000+s[i];j++)
                if(dp[j]<dp[j-s[i]]+f[i])
                    dp[j]=dp[j-s[i]]+f[i];
        }
    ans=0;
    for(i=100000;i<=200000;i++)
        if(dp[i]>0&&ans<dp[i]+i-100000)
            ans=dp[i]+i-100000;
    printf("%d\n",ans);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值