N, M = map(int, input().split())
A = [0] + list(map(int, input().split()))
C = [0] + list(map(int, input().split()))
sum_C = sum(C)
dp = [[0 for _ in range(sum_C + 1)] for _ in range(N + 1)]  # 확보한 메모리를 저장
result = sum_C  # 열의 최댓값

for i in range(1, N + 1):
    byte = A[i]
    cost = C[i]

    for j in range(1, sum_C + 1):
        if j < cost:  # 현재 앱을 비활성화할만큼의 cost가 충분하지 않을 경우
            dp[i][j] = dp[i - 1][j]
        else:
            # 같은 cost 내에서 현재 앱을 끈 뒤의 byte와 현재 앱을 끄지 않은 뒤의 byte를 비교
            dp[i][j] = max(byte + dp[i - 1][j - cost], dp[i - 1][j])

        if dp[i][j] >= M:  # 조건이 충족된다면
            result = min(result, j)  # 더 작은 cost값으로 갱신
if M != 0:
    print(result)
else:
    print(0)