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

w, v = [0] * N, [0] * N

for i in range(N):

	w[i], v[i] = list(map(int, input().split()))



V = sum(v)

# dp[i][j]:i番目までの品物から価値がj以上になるよう選んだときの重さの総和の最小値

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

dp[0][0] = 0

for i in range(N):

	for j in range(V + 1):

		# i+1番目を選ぶ場合

		if j - v[i] >= 0:

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

		# i+1番目を選ばない場合

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



# dp[N][j]がW以下であるようなjの最大値が答えになる

ans = 0

for j in range(V + 1):

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

		ans = j



print(ans)

# import bisect

# import copy

# import fractions

# import math

# import numpy as np

# from collections import Counter, deque

# from itertools import accumulate,permutations, combinations,combinations_with_replacement,product



def resolve():

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

    weight, value = [0] * N, [0] * N

    for i in range(N):

        weight[i], value[i] = list(map(int, input().split()))







    # この前段階で、荷物の数N、ウェイトの上限W、

    # weightの表weightとvalueの表valueは用意しておく。

    def knapsack(N, W, weight, value):



        V=sum(value)

        # dp[i][v]はvを運べる最小のウェイトを意味する。

        # 求めたいのは、dp[N][v]<=Wなるvのmax

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

        dp[0][0]=0



        for i in range(N):

            for v in range(V + 1):

                if v >= value[i]:

                    dp[i + 1][v] = min(dp[i][v], dp[i][v - value[i]] + weight[i])

                else:

                    dp[i + 1][v] = dp[i][v]



        # dp[N][j]がW以下であるようなjの最大値が答えになる

        ans = 0

        for v in range(V + 1):

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

                ans = v



        return ans









    print((knapsack(N, W, weight, value)))





resolve()
N, W = list(map(int, input().split()))
w, v = [0] * N, [0] * N
for i in range(N):
    w[i], v[i] = list(map(int, input().split()))
V = sum(v)
# dp[i][j]:i番目までの品物から価値がj以上になるよう選んだときの重さの総和の最小値
dp = [[float("inf")] * (V + 1) for _ in range(N + 1)]
dp[0][0] = 0
for i in range(N):
    for j in range(V + 1):
        # i+1番目を選ぶ場合
        if j - v[i] >= 0:
            dp[i + 1][j] = min(dp[i + 1][j], dp[i][j - v[i]] + w[i])
        # i+1番目を選ばない場合
        dp[i + 1][j] = min(dp[i + 1][j], dp[i][j])
# dp[N][j]がW以下であるようなjの最大値が答えになる
ans = 0
for j in range(V + 1):
    if dp[N][j] <= W:
        ans = j
print(ans)

# import bisect
# import copy
# import fractions
# import math
# import numpy as np
# from collections import Counter, deque
# from itertools import accumulate,permutations, combinations,combinations_with_replacement,product
def resolve():
    N, W = list(map(int, input().split()))
    weight, value = [0] * N, [0] * N
    for i in range(N):
        weight[i], value[i] = list(map(int, input().split()))
    # この前段階で、荷物の数N、ウェイトの上限W、
    # weightの表weightとvalueの表valueは用意しておく。
    def knapsack(N, W, weight, value):
        V = sum(value)
        # dp[i][v]はvを運べる最小のウェイトを意味する。
        # 求めたいのは、dp[N][v]<=Wなるvのmax
        dp = [[float("inf")] * (V + 1) for _ in range(N + 1)]
        dp[0][0] = 0
        for i in range(N):
            for v in range(V + 1):
                if v >= value[i]:
                    dp[i + 1][v] = min(dp[i][v], dp[i][v - value[i]] + weight[i])
                else:
                    dp[i + 1][v] = dp[i][v]
        # dp[N][j]がW以下であるようなjの最大値が答えになる
        ans = 0
        for v in range(V + 1):
            if dp[N][v] <= W:
                ans = v
        return ans

    print((knapsack(N, W, weight, value)))


resolve()

-N, W = list(map(int, input().split())) -w, v = [0] * N, [0] * N -for i in range(N): -    w[i], v[i] = list(map(int, input().split())) -V = sum(v) -# dp[i][j]:i番目までの品物から価値がj以上になるよう選んだときの重さの総和の最小値 -dp = [[float("inf")] * (V + 1) for _ in range(N + 1)] -dp[0][0] = 0 -for i in range(N): -    for j in range(V + 1): -        # i+1番目を選ぶ場合 -        if j - v[i] >= 0: -            dp[i + 1][j] = min(dp[i + 1][j], dp[i][j - v[i]] + w[i]) -        # i+1番目を選ばない場合 -        dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]) -# dp[N][j]がW以下であるようなjの最大値が答えになる -ans = 0 -for j in range(V + 1): -    if dp[N][j] <= W: -        ans = j -print(ans) +# import bisect +# import copy +# import fractions +# import math +# import numpy as np +# from collections import Counter, deque +# from itertools import accumulate,permutations, combinations,combinations_with_replacement,product +def resolve(): +    N, W = list(map(int, input().split())) +    weight, value = [0] * N, [0] * N +    for i in range(N): +        weight[i], value[i] = list(map(int, input().split())) +    # この前段階で、荷物の数N、ウェイトの上限W、 +    # weightの表weightとvalueの表valueは用意しておく。 +    def knapsack(N, W, weight, value): +        V = sum(value) +        # dp[i][v]はvを運べる最小のウェイトを意味する。 +        # 求めたいのは、dp[N][v]<=Wなるvのmax +        dp = [[float("inf")] * (V + 1) for _ in range(N + 1)] +        dp[0][0] = 0 +        for i in range(N): +            for v in range(V + 1): +                if v >= value[i]: +                    dp[i + 1][v] = min(dp[i][v], dp[i][v - value[i]] + weight[i]) +                else: +                    dp[i + 1][v] = dp[i][v] +        # dp[N][j]がW以下であるようなjの最大値が答えになる +        ans = 0 +        for v in range(V + 1): +            if dp[N][v] <= W: +                ans = v +        return ans + +    print((knapsack(N, W, weight, value))) + + +resolve()