https://vjudge.net/contest/280124#problem/E
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#define maxn 200010
#define inf 0x3f3f3f
using namespace std;
int NN=1000,dp[maxn],n,sum,cnt[maxn],ans,v[105],w[105];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&v[i],&w[i]);
if(v[i]<0&&w[i]<0) {i--;n--;continue;}
v[i]+=1000;
sum+=v[i];
}
for(int i=0;i<=sum;i++) dp[i]=-inf;
dp[0]=0;
for(int i=1;i<=n;i++){
for(int j=sum;j>=v[i];j--){
if(dp[j-v[i]]+w[i]+j-(cnt[j-v[i]]+1)*NN>dp[j]+j-cnt[j]*NN)
{
dp[j]=dp[j-v[i]]+w[i];
cnt[j]=cnt[j-v[i]]+1;
}
}
}
for(int i=1000;i<=sum;i++){
if(dp[i]>=0&&i-cnt[i]*1000>=0)
ans=max(ans,dp[i]+i-cnt[i]*1000);
}
printf("%d\n",ans);
}