import sys

# input処理を高速化する

input = sys.stdin.readline

# 入力

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

array = [list(map(int, input().split())) for _ in range(N)]  # [重さ、価値]

# sum_vの取りうる上限値

# MAX_V = (10**3 + 1) * N

MAX_V = 0

for line in array:

    MAX_V += line[1]

MAX_V += 1

# 最小値を求めるので無限大の値

f_inf = float('inf')





def chmin(a, b):

    if a <= b:

        return a

    else:

        return b





def knapsack(n, w):

    # dpの初期化　dp[i][sum_v]は重さの総和の最小値

    dp = [[f_inf] * MAX_V for j in range(N + 1)]

    # 初期条件

    dp[0][0] = 0

    # forは全て関数の中で回す。

    # 入力

    for i in range(N):

        # w, v = map(int, input().split())

        for sum_v in range(MAX_V):

            # i番目の品物を選ぶ場合

            if sum_v - array[i][1] >= 0:

                dp[i + 1][sum_v] = chmin(dp[i + 1][sum_v],

                                         dp[i][sum_v - array[i][1]] + array[i][0])

            # i番目の品物を選ばない場合

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

    # dp[N][sum_v]の値が、W以下であるsum_vの値の最大値

    ans = 0

    for sum_v in range(MAX_V):

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

            ans = sum_v

    print(ans)





knapsack(N, W)

# N個、重さW

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



# 重さ, 価値

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



# 価値の最大値

sum = 1

for i in range(N):

    sum += array[i][1]



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

# 初期値

weights[0][0] = 0

# 価値ごとの重さの最小値を出す

for n in range(N):

    # 価値が0..1000までのそれぞれについて、価値を超えているうちの重さの最小値を算出する

    for v in range(sum + 1):

        # n回目の品物を持ち帰らない場合の重量

        weights[n + 1][v] = weights[n][v]

        weight = weights[n][v - array[n][1]] + array[n][0]

        if weight < weights[n + 1][v]:

            weights[n + 1][v] = weight



ans = 0

for i in range(sum):

    if weights[N][i] <= W:

        ans = i

print(f"{ans}")

import sys

# input処理を高速化する
input = sys.stdin.readline
# 入力
N, W = list(map(int, input().split()))
array = [list(map(int, input().split())) for _ in range(N)]  # [重さ、価値]
# sum_vの取りうる上限値
# MAX_V = (10**3 + 1) * N
MAX_V = 0
for line in array:
    MAX_V += line[1]
MAX_V += 1
# 最小値を求めるので無限大の値
f_inf = float("inf")


def chmin(a, b):
    if a <= b:
        return a
    else:
        return b


def knapsack(n, w):
    # dpの初期化　dp[i][sum_v]は重さの総和の最小値
    dp = [[f_inf] * MAX_V for j in range(N + 1)]
    # 初期条件
    dp[0][0] = 0
    # forは全て関数の中で回す。
    # 入力
    for i in range(N):
        # w, v = map(int, input().split())
        for sum_v in range(MAX_V):
            # i番目の品物を選ぶ場合
            if sum_v - array[i][1] >= 0:
                dp[i + 1][sum_v] = chmin(
                    dp[i + 1][sum_v], dp[i][sum_v - array[i][1]] + array[i][0]
                )
            # i番目の品物を選ばない場合
            dp[i + 1][sum_v] = chmin(dp[i + 1][sum_v], dp[i][sum_v])
    # dp[N][sum_v]の値が、W以下であるsum_vの値の最大値
    ans = 0
    for sum_v in range(MAX_V):
        if dp[N][sum_v] <= W:
            ans = sum_v
    print(ans)


knapsack(N, W)

# N個、重さW
N, W = list(map(int, input().split()))
# 重さ, 価値
array = [list(map(int, input().split())) for _ in range(N)]
# 価値の最大値
sum = 1
for i in range(N):
    sum += array[i][1]
weights = [[float("inf")] * (sum + 1) for _ in range(N + 1)]
# 初期値
weights[0][0] = 0
# 価値ごとの重さの最小値を出す
for n in range(N):
    # 価値が0..1000までのそれぞれについて、価値を超えているうちの重さの最小値を算出する
    for v in range(sum + 1):
        # n回目の品物を持ち帰らない場合の重量
        weights[n + 1][v] = weights[n][v]
        weight = weights[n][v - array[n][1]] + array[n][0]
        if weight < weights[n + 1][v]:
            weights[n + 1][v] = weight
ans = 0
for i in range(sum):
    if weights[N][i] <= W:
        ans = i
print(f"{ans}")

-import sys - -# input処理を高速化する -input = sys.stdin.readline -# 入力 +# N個、重さW -array = [list(map(int, input().split())) for _ in range(N)]  # [重さ、価値] -# sum_vの取りうる上限値 -# MAX_V = (10**3 + 1) * N -MAX_V = 0 -for line in array: -    MAX_V += line[1] -MAX_V += 1 -# 最小値を求めるので無限大の値 -f_inf = float("inf") - - -def chmin(a, b): -    if a <= b: -        return a -    else: -        return b - - -def knapsack(n, w): -    # dpの初期化　dp[i][sum_v]は重さの総和の最小値 -    dp = [[f_inf] * MAX_V for j in range(N + 1)] -    # 初期条件 -    dp[0][0] = 0 -    # forは全て関数の中で回す。 -    # 入力 -    for i in range(N): -        # w, v = map(int, input().split()) -        for sum_v in range(MAX_V): -            # i番目の品物を選ぶ場合 -            if sum_v - array[i][1] >= 0: -                dp[i + 1][sum_v] = chmin( -                    dp[i + 1][sum_v], dp[i][sum_v - array[i][1]] + array[i][0] -                ) -            # i番目の品物を選ばない場合 -            dp[i + 1][sum_v] = chmin(dp[i + 1][sum_v], dp[i][sum_v]) -    # dp[N][sum_v]の値が、W以下であるsum_vの値の最大値 -    ans = 0 -    for sum_v in range(MAX_V): -        if dp[N][sum_v] <= W: -            ans = sum_v -    print(ans) - - -knapsack(N, W) +# 重さ, 価値 +array = [list(map(int, input().split())) for _ in range(N)] +# 価値の最大値 +sum = 1 +for i in range(N): +    sum += array[i][1] +weights = [[float("inf")] * (sum + 1) for _ in range(N + 1)] +# 初期値 +weights[0][0] = 0 +# 価値ごとの重さの最小値を出す +for n in range(N): +    # 価値が0..1000までのそれぞれについて、価値を超えているうちの重さの最小値を算出する +    for v in range(sum + 1): +        # n回目の品物を持ち帰らない場合の重量 +        weights[n + 1][v] = weights[n][v] +        weight = weights[n][v - array[n][1]] + array[n][0] +        if weight < weights[n + 1][v]: +            weights[n + 1][v] = weight +ans = 0 +for i in range(sum): +    if weights[N][i] <= W: +        ans = i +print(f"{ans}")