N = int(eval(input()))

"""

dp[i][j] -> i番目の人間までみる。j人が積むときの最小値。



"""

HP = [list(map(int,input().split())) for _ in range(N)]

HP.sort(key=lambda x:x[0]+x[1])

dp = [float("INF")]*(N+1)

dp[0] = 0

for i in range(1,N+1):

    for j in range(N,0,-1):

        if dp[j-1] <= HP[i-1][0]:

            dp[j] = min(dp[j],dp[j-1]+HP[i-1][1])

for j in range(N,-1,-1):

    if dp[j] != float("INF"):

        print(j)

        break

"""

Aさん：身長Ha , パワーPa

Bさん：身長Hb , パワーPb

二人どちらも積めるのに順番を間違えたばかりに一人しか積めない、という事態を避けたい。

Aさんが先に積むべき？Bさんが先に積むべき？

Aさん、Bさんの手前までの時点で高さSまで積みあがっているとする。S <= min(Hb,Ha)とする。



S+Pa > Hb　かつ S+Pb <= HaならBが先

S+Pb > Ha　かつ S+Pa <= HbならAが先



Pa-Hb > Pb-Ha ならBが先でAが後

書き換えるとPa+Ha > Pb+HbならBが先でAが後

つまり、P+H順にソートしてナップサックすればよい

"""





N = int(eval(input()))

HP = [list(map(int,input().split())) for _ in range(N)]

HP.sort(key = lambda x:x[0]+x[1])

#dp[i][j] -> j人積む場合の座布団の最小枚数

dp = [float("INF")]*(N+1)

dp[0] = 0

for h,p in HP:

    for j in range(N,0,-1):

        if dp[j-1] <= h:

            dp[j] = min(dp[j],dp[j-1]+p)



for j in range(N,-1,-1):

    if dp[j] != float("INF"):

        print(j)

        break
N = int(eval(input()))
"""
dp[i][j] -> i番目の人間までみる。j人が積むときの最小値。
"""
HP = [list(map(int, input().split())) for _ in range(N)]
HP.sort(key=lambda x: x[0] + x[1])
dp = [float("INF")] * (N + 1)
dp[0] = 0
for i in range(1, N + 1):
    for j in range(N, 0, -1):
        if dp[j - 1] <= HP[i - 1][0]:
            dp[j] = min(dp[j], dp[j - 1] + HP[i - 1][1])
for j in range(N, -1, -1):
    if dp[j] != float("INF"):
        print(j)
        break

"""
Aさん：身長Ha , パワーPa
Bさん：身長Hb , パワーPb
二人どちらも積めるのに順番を間違えたばかりに一人しか積めない、という事態を避けたい。
Aさんが先に積むべき？Bさんが先に積むべき？
Aさん、Bさんの手前までの時点で高さSまで積みあがっているとする。S <= min(Hb,Ha)とする。
S+Pa > Hb　かつ S+Pb <= HaならBが先
S+Pb > Ha　かつ S+Pa <= HbならAが先
Pa-Hb > Pb-Ha ならBが先でAが後
書き換えるとPa+Ha > Pb+HbならBが先でAが後
つまり、P+H順にソートしてナップサックすればよい
"""
N = int(eval(input()))
HP = [list(map(int, input().split())) for _ in range(N)]
HP.sort(key=lambda x: x[0] + x[1])
# dp[i][j] -> j人積む場合の座布団の最小枚数
dp = [float("INF")] * (N + 1)
dp[0] = 0
for h, p in HP:
    for j in range(N, 0, -1):
        if dp[j - 1] <= h:
            dp[j] = min(dp[j], dp[j - 1] + p)
for j in range(N, -1, -1):
    if dp[j] != float("INF"):
        print(j)
        break

+""" +Aさん：身長Ha , パワーPa +Bさん：身長Hb , パワーPb +二人どちらも積めるのに順番を間違えたばかりに一人しか積めない、という事態を避けたい。 +Aさんが先に積むべき？Bさんが先に積むべき？ +Aさん、Bさんの手前までの時点で高さSまで積みあがっているとする。S <= min(Hb,Ha)とする。 +S+Pa > Hb　かつ S+Pb <= HaならBが先 +S+Pb > Ha　かつ S+Pa <= HbならAが先 +Pa-Hb > Pb-Ha ならBが先でAが後 +書き換えるとPa+Ha > Pb+HbならBが先でAが後 +つまり、P+H順にソートしてナップサックすればよい +""" -""" -dp[i][j] -> i番目の人間までみる。j人が積むときの最小値。 -""" +# dp[i][j] -> j人積む場合の座布団の最小枚数 -for i in range(1, N + 1): +for h, p in HP: -        if dp[j - 1] <= HP[i - 1][0]: -            dp[j] = min(dp[j], dp[j - 1] + HP[i - 1][1]) +        if dp[j - 1] <= h: +            dp[j] = min(dp[j], dp[j - 1] + p)