#include <bits/stdc++.h>
#include <ext/rope>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/detail/standard_policies.hpp>
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int ui;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<ii, ii> iii;
int MOD = 10;
const ld E = 1e-9;
#define null NULL
#define ms(x) memset(x, 0, sizeof(x))
#ifndef LOCAL
#define endl "\n"
#endif
#ifndef LONG_LONG_MAX
#define LONG_LONG_MAX LLONG_MAX
#endif
#define sync ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define _read(x) freopen(x, "r", stdin)
#define _write(x) freopen(x, "w", stdout)
#define files(x) _read(x ".in"); _write(x ".out")
#define filesdatsol(x) _read(x ".DAT"); _write(x ".SOL")
#define output _write("output.txt")
#define input _read("input.txt")
#define prev time_prev
#ifndef M_PI
#define M_PI acos(-1)
#endif
#define remove tipa_remove
#define next tipa_next
#define left tipa_left
#define right tipa_right
#define mod % MOD
#define y1 hello_world
unsigned char ccc;
bool _minus = false;
template<typename T>
inline T sqr(T t) {
	return (t * t);
}
inline void read(ll &n) {
	n = 0;
	_minus = false;
	while (true) {
		ccc = getchar();
		if (ccc == ' ' || ccc == '\n')
			break;
		if (ccc == '-') {
			_minus = true;
			continue;
		}
		n = n * 10 + ccc - '0';
	}
	if (_minus)
		n *= -1;
}
inline bool read(int &n) {
	n = 0;
	_minus = false;
	while (true) {
		ccc = getchar();
		if (ccc == ' ' || ccc == '\n') {
			if (ccc == '\n')
				return true;
			break;
		}
		if (ccc == '-') {
			_minus = true;
			continue;
		}
		n = n * 10 + ccc - '0';
	}
	if (_minus)
		n *= -1;
	return false;
}
char wwww[19];
int kkkk;
inline void write(ll y) {
	long long x = y;
	kkkk = 0;
	if (x < 0) {
		putchar('-');
		x *= -1;
	}
	if (!x)
		++kkkk, wwww[kkkk] = '0';
	else
		while (x) {
			++kkkk;
			wwww[kkkk] = char(x % 10 + '0');
			x /= 10;
		}
	for (int i = kkkk; i >= 1; --i)
		putchar(wwww[i]);
}
#ifdef LOCAL
#define DEBUG
#endif
#ifdef DEBUG
#define dbg if(1)
#else
#define dbg if(0)
#endif

bool cmp(pair<int, int> a, pair<int, int> b) {
	if (a.first + a.second != b.first + b.second) {
		return a.first + a.second < b.first + b.second;
	} else {
		return a.first < b.first;
	}
}

ll dp[5002];

ll solve(vector<pair<int, int> > &v) {
	dp[0] = 0;
	int ans = 0;
	for (int i = 1; i <= (int) v.size() + 1; i++) {
		dp[i] = 1e18;
	}
	for (int j = 0; j < (int) v.size(); j++) {
		for (int i = ans; i >= 0; i--) {
			if (dp[i] < 1e18 && dp[i] <= v[j].first) {
				dp[i + 1] = min(dp[i + 1], dp[i] + v[j].second);
			}
			while (dp[ans + 1] < 1e18) {
				ans++;
			}
		}
	}
	return ans;
}

ll solve_ok(vector<pair<int, int> > v) {
	sort(v.begin(), v.end(), cmp);
	return solve(v);
}

ll solve_long(vector<pair<int, int> > v) {
	int n = (int) v.size();
	vector<int> t(n);
	for (int i = 0; i < n; i++) {
		t[i] = i;
	}
	ll ans = 0;
	do {
		vector<pair<int, int> > e;
		for (int i : t) {
			e.push_back(v[i]);
		}
		ans = max(ans, solve(e));
	} while (next_permutation(t.begin(), t.end()));
	return ans;
}

int main() {
	sync;
	srand(time(NULL));
	cout.precision(10);
	cout << fixed;
#ifdef LOCAL
	input;
#else

#endif

	int n;
	cin >> n;

	vector<pair<int, int> > vec(n);
	for(int i = 0; i < n; i++) {
		cin >> vec[i].first >> vec[i].second;
	}

	cout << solve_ok(vec) << endl;

}


Measured memory_bytes: 384