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



# Dのように品物と重さでループまわすとO(nW)で今W<=10**9だから間に合わない

# 品物と価値でループ回す

# dp[i][j]の意味はi番目までの品物で、価値j以上となるように選んだ時の、重さの最小値

sum_v = sum(v)

dp = [[float("inf")]*(sum_v+1) for i in range(n+1)]

dp[0][0] = 0

for i in range(n):

    for j in range(sum_v+1):

        if j - v[i] >= 0:

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

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

#print(dp)

ans = 0

for j in range(sum_v+1):

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

        ans = j

print(ans)



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

w, v = [0]*(n+1), [0]*(n+1)

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

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



#制約から、品物と価値のdpにする

dp = [[float("inf")]*(sum(v)+1) for _ in range(n+1)]

dp[0][0] = 0

#dp[i][j]はi番目までの品物の中から、価値jを

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

    for j in range(sum(v) + 1):

        dp[i][j] = dp[i-1][j]

        if j - v[i] >= 0:

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

ans = 0

for i in range(sum(v)+1):

    if dp[n][i] <= W:

        ans = max(ans, i)

#print(dp[n])

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()))
# Dのように品物と重さでループまわすとO(nW)で今W<=10**9だから間に合わない
# 品物と価値でループ回す
# dp[i][j]の意味はi番目までの品物で、価値j以上となるように選んだ時の、重さの最小値
sum_v = sum(v)
dp = [[float("inf")] * (sum_v + 1) for i in range(n + 1)]
dp[0][0] = 0
for i in range(n):
    for j in range(sum_v + 1):
        if j - v[i] >= 0:
            dp[i + 1][j] = min(dp[i + 1][j], dp[i][j - v[i]] + w[i])
        dp[i + 1][j] = min(dp[i + 1][j], dp[i][j])
# print(dp)
ans = 0
for j in range(sum_v + 1):
    if dp[n][j] <= W:
        ans = j
print(ans)

n, W = list(map(int, input().split()))
w, v = [0] * (n + 1), [0] * (n + 1)
for i in range(1, n + 1):
    w[i], v[i] = list(map(int, input().split()))
# 制約から、品物と価値のdpにする
dp = [[float("inf")] * (sum(v) + 1) for _ in range(n + 1)]
dp[0][0] = 0
# dp[i][j]はi番目までの品物の中から、価値jを
for i in range(1, n + 1):
    for j in range(sum(v) + 1):
        dp[i][j] = dp[i - 1][j]
        if j - v[i] >= 0:
            dp[i][j] = min(dp[i][j], dp[i - 1][j - v[i]] + w[i])
ans = 0
for i in range(sum(v) + 1):
    if dp[n][i] <= W:
        ans = max(ans, i)
# print(dp[n])
print(ans)

-w, v = [0] * n, [0] * n -for i in range(n): +w, v = [0] * (n + 1), [0] * (n + 1) +for i in range(1, n + 1): -# Dのように品物と重さでループまわすとO(nW)で今W<=10**9だから間に合わない -# 品物と価値でループ回す -# dp[i][j]の意味はi番目までの品物で、価値j以上となるように選んだ時の、重さの最小値 -sum_v = sum(v) -dp = [[float("inf")] * (sum_v + 1) for i in range(n + 1)] +# 制約から、品物と価値のdpにする +dp = [[float("inf")] * (sum(v) + 1) for _ in range(n + 1)] -for i in range(n): -    for j in range(sum_v + 1): +# dp[i][j]はi番目までの品物の中から、価値jを +for i in range(1, n + 1): +    for j in range(sum(v) + 1): +        dp[i][j] = dp[i - 1][j] -            dp[i + 1][j] = min(dp[i + 1][j], dp[i][j - v[i]] + w[i]) -        dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]) -# print(dp) +            dp[i][j] = min(dp[i][j], dp[i - 1][j - v[i]] + w[i]) -for j in range(sum_v + 1): -    if dp[n][j] <= W: -        ans = j +for i in range(sum(v) + 1): +    if dp[n][i] <= W: +        ans = max(ans, i) +# print(dp[n])