考虑01背包,把智商看成体积,情商看成价值。为了处理负数部分,将数组偏移一下。在负数的时候需要注意转移的顺序。
从这道题中的一个小trick,就是求两个数组里选数求最值,可以用背包处理出一个值固定时另一个值的最值。
#include<bits/stdc++.h>
using namespace std;
int n;
const int N=400000,M=800000;
int a[401],b[401],dp[810001];
int main()
{
cin >> n;
for (int i=1;i<=n;i++)
{
cin >> a[i] >> b[i];
}
memset(dp,-0x3f,sizeof(dp));
dp[N]=0;
for (int i=1;i<=n;i++)
{
if (a[i]>0)
{
for (int j=M;j>=a[i];j--) dp[j]=max(dp[j],dp[j-a[i]]+b[i]);
}
else
{
for (int j=0;j<=M+a[i];j++) dp[j]=max(dp[j],dp[j-a[i]]+b[i]);
}
}
int ans=0;
for (int i=N;i<=M;i++)
{
if (dp[i]>=0) ans=max(ans,dp[i]+i-N);
}
cout << ans;
return 0;
}