[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;
}

浙公网安备 33010602011771号