// 给定n头牛,每头有属性智商和幽默感,这两个属性值有正有负,现在要从这n头牛中选出若干头使得他们的智商和与幽默感和不为负数,
// 并且两者两家和最大,如果无解输出0,n<=100,-1000<val<1000.
// 这题是好题 思路来自以下博客
// http://blog.csdn.net/woshi250hua/article/details/7633450
// 我开始想的是 dp[i][j][k] 放置i头牛 智商为j 幽默感为 k 是否存在 然后发现空间不允许呀、、
// 别人思路 : 将智商作为容量 幽默感作为 价值 瞬间醒悟、原来可以这样的、、然后就是普通背包了
// 1A
#include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 200010
int dp[maxn];
int S[110],F[110];
int main()
{
int N;
while(scanf("%d",&N)!=EOF){
int i,j,k;
int len=0,le=0;
for(i=1;i<=N;i++)
{
scanf("%d %d",&S[i],&F[i]);
if(S[i]>=0) len+=S[i];
else le+=(-S[i]);
}
len=max(len,le);
for(i=1;i<=2*len;i++)
dp[i]=-MOD;
dp[0]=0;
// memset(dp,0,sizeof(dp));
for(i=1;i<=N;i++)
if(S[i]>=0){ // 根据这个判断转移方向
for(j=len;j>=S[i]-len;j--){
k=j-S[i];
if(k<0) k=-k+len;
if(j<0) j=-j+len;
dp[j]=max(dp[j],dp[k]+F[i]);
if(j>len) j=len-j;
}
}else{
for(j=-len;j<=len+S[i];j++){
k=j-S[i];
if(k<0) k=-k+len;
if(j<0) j=-j+len;
dp[j]=max(dp[j],dp[k]+F[i]);
if(j>len) j=len-j;
}
}
int ans=0;
for(i=0;i<=len;i++) if(dp[i]>=0) ans=max(ans,i+dp[i]);//,printf("%d %d?",i,dp[i]);
printf("%d
",ans);
}
return 0;
}