def solve(N, blocks): blocks.sort(key=lambda x: x[0] + x[1]) INF = 10 ** 18 dp = [INF] * (N + 1) dp[0] = 0 for i, (w, s) in enumerate(blocks): new_dp = dp.copy() for n in range(N): if dp[n] <= s: new_dp[n + 1] = min(dp[n] + w, new_dp[n + 1]) dp = new_dp for n in range(N, -1, -1): if dp[n] != INF: return n return 0 N = int(input()) blocks = list(tuple(map(int, input().split())) for _ in range(N)) print(solve(N, blocks))