#include<iostream>
#include<vector>
using namespace std;
int n, barweight;
void solve(){
vector<int> value(n, 0);
vector<int> weight(n, 0);
for(int i = 0; i < n; i++){
cin >> weight[i];
}
for(int i = 0; i < n; i++){
cin >> value[i];
}
vector<int> dp(barweight + 1, 0);
for(int i = 0; i < n; i++){
for(int j = barweight; j >=weight[i]; j--){
dp[j] = max(dp[j], dp[j-weight[i]]+value[i]);
}
}
cout << dp[barweight] <<endl;
return;
}
int main(){
cin >> n;
cin >> barweight;
solve();
return 0;
}
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(int a : nums){
sum += a;
}
if (sum % 2 == 1) return false;
sum = sum / 2;
vector<int> dp(sum + 1, 0);
for(int i = 0; i < nums.size(); i++){
for(int j = sum; j >= nums[i]; j--){
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
}
}
if(dp[sum] == sum) return true;
return false;
}
};