#include <bits/stdc++.h>
using namespace std;
int grid[1000][100000];
int h[1000], s[1000];
int n,x;
bool finished[1000][100000];
int solve(int i, int j) {
if(i==0) {
return 0;
}
if(finished[i][j]) return grid[i][j];
finished[i][j]=true;
// ga diambil
grid[i][j]=solve(i-1, j);
// ambil
if(x>=s[i]) {
grid[i][j]=max(grid[i][j], solve(i-1, j-s[i])+h[i]);
}
return grid[n][x];
}
int main() {
cin >> n >> x;
for(int i=0; i<n; i++) {
cin >> h[i];
}
for(int i=0; i<n; i++) {
cin >> s[i];
}
cout << solve(n,x) << endl;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgZ3JpZFsxMDAwXVsxMDAwMDBdOwppbnQgaFsxMDAwXSwgc1sxMDAwXTsKaW50IG4seDsKYm9vbCBmaW5pc2hlZFsxMDAwXVsxMDAwMDBdOwoKaW50IHNvbHZlKGludCBpLCBpbnQgaikgewoJaWYoaT09MCkgewoJCXJldHVybiAwOwoJfQoKCWlmKGZpbmlzaGVkW2ldW2pdKSByZXR1cm4gZ3JpZFtpXVtqXTsKCWZpbmlzaGVkW2ldW2pdPXRydWU7CgoJLy8gZ2EgZGlhbWJpbAoJZ3JpZFtpXVtqXT1zb2x2ZShpLTEsIGopOwoKCS8vIGFtYmlsCglpZih4Pj1zW2ldKSB7CgkJZ3JpZFtpXVtqXT1tYXgoZ3JpZFtpXVtqXSwgc29sdmUoaS0xLCBqLXNbaV0pK2hbaV0pOwoJfQoKCXJldHVybiBncmlkW25dW3hdOwp9CgppbnQgbWFpbigpIHsKCWNpbiA+PiBuID4+IHg7CgoJZm9yKGludCBpPTA7IGk8bjsgaSsrKSB7CgkJY2luID4+IGhbaV07Cgl9Cglmb3IoaW50IGk9MDsgaTxuOyBpKyspIHsKCQljaW4gPj4gc1tpXTsKCX0KCgljb3V0IDw8IHNvbHZlKG4seCkgPDwgZW5kbDsKfQ==