#include <iostream>
#include <algorithm>
using namespace std;

// dp[k][sum] := w[k] まで使ったときに合計が sum になるかどうか
bool dp[1001][1001];

int main(){
	int N, r[1001], w[1001];
	while( cin >> N , N ){
		for(int i = 0 ; i < 1001 ; i++ ) fill(dp[i], dp[i] + 1001, false);
	
		int sum_r = 0, sum_w = 0, max_r = 0, k;
		for(int i = 0 ; i < N ; i++ ){
			cin >> r[i] >> w[i];
			sum_r += r[i];
			sum_w += w[i];
			if( max_r < r[i] ){
				k = i;
			}
			max_r = max(max_r, r[i]);
		}

		if( max_r <= sum_r - max_r ){
			cout << sum_r + sum_w << endl;
		}else{
			// wt := 待ち時間
			int wt = 2 * max_r - sum_r, res = 0;
			
			// w[0..N-1] の部分和で wt 以下の最大値を DP で求める
			// r[k] の本はまだ読んでいないので感想は書けない
			w[k] = 0;
			dp[0][0] = true;
			for(int i = 0 ; i < N ; i++ ){
				for(int j = 0 ; j <= wt ; j++ ){
					if( dp[i][j] ){
						dp[i + 1][j] = dp[i][j];
						if( j + w[i] <= wt ){
							dp[i + 1][j + w[i]] = dp[i][j];
						}
					}
				}
			}
			for(int j = 0 ; j <= wt ; j++ ){
				if( dp[N][j] ) res = j;
			}
			int ans = 2 * max_r + sum_w - res;
			cout << ans << endl;
		}
	}
}