



# N個の荷物、ナップザックの容量はW

N, W = list(map(int, input().split()))

w = [0] * N

v = [0] * N



for i in range(N):

    a, b = list(map(int, input().split()))

    w[i] = a

    v[i] = b



# 1 <= W <= 10^9なので横軸をWにするとテーブルがでかすぎる

# そのかわりにVの方を横軸にする



# 価値の総合計はまだ不明なので、適当にでかい値にしとく

# 最上部と最左部に0が入るので、その分を+1

V = N*1000+1

dp = [ [float('inf') for _ in range(V+1)] for _ in range(N+1) ]



# 最小値を求めるので、上記でinfが入ってるので、初期値は0をいれる必要がある

dp[0][0] = 0



# dp[i][sum_v] = これまで(i-1)番目までの品物から価値がsum_v以上になるように選んだときの、重さの総和の最小値

for i in range(N):

    for sum_v in range(V):

        if sum_v - v[i] >= 0:

            dp[i+1][sum_v] = min(dp[i+1][sum_v], dp[i][sum_v-v[i]]+w[i])



        dp[i+1][sum_v] = min(dp[i+1][sum_v], dp[i][sum_v])





# 中身がWなので、W以下であるうちのsum_vの最大値を求めればいい

for sum_v in range(V):

    # 最終行だけ見ればいいので、端からsum_vの最大値をなめるだけ

    if dp[N][sum_v] <= W:

        ans = sum_v



print(ans)




import sys

input = sys.stdin.readline

sys.setrecursionlimit(2147483647)

INF=float("inf")

MOD=10**9+7

# A = [ int(input()) for _ in range(N) ]

##############################



N, W = list(map(int, input().split()))

w = []

v = []

for i in range(N):

    a, b = list(map(int, input().split()))

    w.append(a)

    v.append(b)



V = sum(v)



dp = [ [INF for _ in range(V+1)] for _ in range(N+1) ]



dp[0][0] = 0



for i in range(N):

    for j in range(V+1):

        if j - v[i] < 0:

            dp[i+1][j] = dp[i][j]

        else:

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



#print(dp[N])



ans = 0

for v in range(V+1):

    if dp[N][v] <= W:

        ans = v



print(ans)

# N個の荷物、ナップザックの容量はW
N, W = list(map(int, input().split()))
w = [0] * N
v = [0] * N
for i in range(N):
    a, b = list(map(int, input().split()))
    w[i] = a
    v[i] = b
# 1 <= W <= 10^9なので横軸をWにするとテーブルがでかすぎる
# そのかわりにVの方を横軸にする
# 価値の総合計はまだ不明なので、適当にでかい値にしとく
# 最上部と最左部に0が入るので、その分を+1
V = N * 1000 + 1
dp = [[float("inf") for _ in range(V + 1)] for _ in range(N + 1)]
# 最小値を求めるので、上記でinfが入ってるので、初期値は0をいれる必要がある
dp[0][0] = 0
# dp[i][sum_v] = これまで(i-1)番目までの品物から価値がsum_v以上になるように選んだときの、重さの総和の最小値
for i in range(N):
    for sum_v in range(V):
        if sum_v - v[i] >= 0:
            dp[i + 1][sum_v] = min(dp[i + 1][sum_v], dp[i][sum_v - v[i]] + w[i])
        dp[i + 1][sum_v] = min(dp[i + 1][sum_v], dp[i][sum_v])
# 中身がWなので、W以下であるうちのsum_vの最大値を求めればいい
for sum_v in range(V):
    # 最終行だけ見ればいいので、端からsum_vの最大値をなめるだけ
    if dp[N][sum_v] <= W:
        ans = sum_v
print(ans)

import sys

input = sys.stdin.readline
sys.setrecursionlimit(2147483647)
INF = float("inf")
MOD = 10**9 + 7
# A = [ int(input()) for _ in range(N) ]
##############################
N, W = list(map(int, input().split()))
w = []
v = []
for i in range(N):
    a, b = list(map(int, input().split()))
    w.append(a)
    v.append(b)
V = sum(v)
dp = [[INF for _ in range(V + 1)] for _ in range(N + 1)]
dp[0][0] = 0
for i in range(N):
    for j in range(V + 1):
        if j - v[i] < 0:
            dp[i + 1][j] = dp[i][j]
        else:
            dp[i + 1][j] = min(dp[i][j], dp[i][j - v[i]] + w[i])
# print(dp[N])
ans = 0
for v in range(V + 1):
    if dp[N][v] <= W:
        ans = v
print(ans)

-# N個の荷物、ナップザックの容量はW +import sys + +input = sys.stdin.readline +sys.setrecursionlimit(2147483647) +INF = float("inf") +MOD = 10**9 + 7 +# A = [ int(input()) for _ in range(N) ] +############################## -w = [0] * N -v = [0] * N +w = [] +v = [] -    w[i] = a -    v[i] = b -# 1 <= W <= 10^9なので横軸をWにするとテーブルがでかすぎる -# そのかわりにVの方を横軸にする -# 価値の総合計はまだ不明なので、適当にでかい値にしとく -# 最上部と最左部に0が入るので、その分を+1 -V = N * 1000 + 1 -dp = [[float("inf") for _ in range(V + 1)] for _ in range(N + 1)] -# 最小値を求めるので、上記でinfが入ってるので、初期値は0をいれる必要がある +    w.append(a) +    v.append(b) +V = sum(v) +dp = [[INF for _ in range(V + 1)] for _ in range(N + 1)] -# dp[i][sum_v] = これまで(i-1)番目までの品物から価値がsum_v以上になるように選んだときの、重さの総和の最小値 -    for sum_v in range(V): -        if sum_v - v[i] >= 0: -            dp[i + 1][sum_v] = min(dp[i + 1][sum_v], dp[i][sum_v - v[i]] + w[i]) -        dp[i + 1][sum_v] = min(dp[i + 1][sum_v], dp[i][sum_v]) -# 中身がWなので、W以下であるうちのsum_vの最大値を求めればいい -for sum_v in range(V): -    # 最終行だけ見ればいいので、端からsum_vの最大値をなめるだけ -    if dp[N][sum_v] <= W: -        ans = sum_v +    for j in range(V + 1): +        if j - v[i] < 0: +            dp[i + 1][j] = dp[i][j] +        else: +            dp[i + 1][j] = min(dp[i][j], dp[i][j - v[i]] + w[i]) +# print(dp[N]) +ans = 0 +for v in range(V + 1): +    if dp[N][v] <= W: +        ans = v