Link to this code: https://cses.fi/paste/13f0d0b74d1426c0c7a347/
/* 777 */
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define FAST_IO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

int n, k;
// int dp[1001][100001], arr[1001], cost[1001];
int dp[2][100001], arr[1001], cost[1001];

/*
int rec(int level, int rem) {
    if (level == n) return 0;
    int tot = rec(level + 1, rem);
    if (arr[level] <= rem) tot = max(tot, cost[level] + rec(level + 1, rem - arr[level]));
    return tot;
}
*/

/*
void solve() {
    cin >> n >> k;
    for (int i = 0 ; i < n ; ++i) cin >> arr[i];
    for (int i = 0 ; i < n ; ++i) cin >> cost[i];
    // cout << rec(0, k);
    
    for (int level = n - 1 ; level >= 0 ; level--) {
        for (int rem = 0 ; rem <= k ; rem++) {
            dp[level][rem] = dp[level + 1][rem];
            if (arr[level] <= rem) {
                dp[level][rem] = max(dp[level][rem], cost[level] + dp[level + 1][rem  - arr[level]]);
            }
        }
    }
    
    cout << dp[0][k];
}
*/

void solve() {
    cin >> n >> k;
    for (int i = 0 ; i < n ; ++i) cin >> arr[i];
    for (int i = 0 ; i < n ; ++i) cin >> cost[i];
    // cout << rec(0, k);
    
    for (int level = n - 1 ; level >= 0 ; level--) {
        for (int rem = 0 ; rem <= k ; rem++) {
            dp[level & 1][rem] = dp[(level + 1) & 1][rem];
            if (arr[level] <= rem) {
                dp[level & 1][rem] = max(dp[level & 1][rem], cost[level] + dp[(level + 1) & 1][rem  - arr[level]]);
            }
        }
    }
    
    cout << dp[0][k];
}

int32_t main() {
    FAST_IO
    solve();
}