[USACO03FALL] Cow Exhibition G

题目链接:https://www.luogu.com.cn/problem/P2340

题意:

有n头牛,每头牛有情商和智商,要求在这n头牛选择一些牛使 智商总和大于等于0 且 情商总和大于等于0,求满足条件的 情商+智商和最大值

思路:

01背包

记f[j]:情商为j时的智商最大值。那么我们只需要求当j>=0,f[j]>=0时的max(j+f[j])

由于智商,情商有可能为负数,且最大值为4e5

不妨开一个8e5的数组,表示[-4e5,4e5]范围的数

我们需要在这个范围内进行dp

对于情商为正的牛,正常从后往前dp

而对于情商为负的牛,需要从前往后dp,因为空间压缩的01背包dp要求一行内的dp不能覆盖,显然我们是 从情商较大的位置 加上 负的情商 转移得到 该位置的情商

也就是从后往前转移,因此不会修改后面的dp数组值,保证了正确性

int dp[800005];
void solve(){
    int n;cin>>n;
    memset(dp, -inf,sizeof dp);
    dp[400000]=0;
    int l=0,r=800000;
    rep(i,1,n){
        int s,f;cin>>s>>f;
        if(f>=0){
            for(int j=r;j>=f;j--){
                dp[j]=max(dp[j],dp[j-f]+s);
            }
        }else{
            for(int j=l;j<=800000+f;j++){
                dp[j]=max(dp[j],dp[j-f]+s);
            }
        }
    }
    int res=0;
    rep(i,400000,800000){
        if(dp[i]>=0)res=max(res,i-400000+dp[i]);
    }
    cout<<res<<endl;
}
posted @ 2025-05-08 15:26  Marinaco  阅读(16)  评论(0)    收藏  举报
//雪花飘落效果