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番目を入れる場合vs入れない場合（前の段階から足し合わせることで価値がj以上になる場合）

        if j - v[i] >= 0:

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

        else:

            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)
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)

Vi=[0] * N

for i in range(N):

    if i==0:

        Vi[i]=v[i]

    else:

        Vi[i]=Vi[i-1]+v[i]



# 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(Vi[i] + 1):

        # i+1番目を入れる場合vs入れない場合（前の段階から足し合わせることで価値がj以上になる場合）

        if j - v[i] >= 0:

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

        else:

            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)
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番目を入れる場合vs入れない場合（前の段階から足し合わせることで価値がj以上になる場合）
        if j - v[i] >= 0:
            dp[i + 1][j] = min(dp[i][j], dp[i][j - v[i]] + w[i])
        else:
            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)

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)
Vi = [0] * N
for i in range(N):
    if i == 0:
        Vi[i] = v[i]
    else:
        Vi[i] = Vi[i - 1] + v[i]
# 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(Vi[i] + 1):
        # i+1番目を入れる場合vs入れない場合（前の段階から足し合わせることで価値がj以上になる場合）
        if j - v[i] >= 0:
            dp[i + 1][j] = min(dp[i][j], dp[i][j - v[i]] + w[i])
        else:
            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)

+Vi = [0] * N +for i in range(N): +    if i == 0: +        Vi[i] = v[i] +    else: +        Vi[i] = Vi[i - 1] + v[i] -    for j in range(V + 1): +    for j in range(Vi[i] + 1):