#include <iostream>
#include <stdio.h>#include <algorithm>
using namespace std;
const int maxn=100;
int main(int argc, char** argv) {
int n,V;
scanf("%d%d",&n,&V);
int w[maxn],c[maxn];
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);
}
int dp[maxn][maxn];
//边界条件;
for(int i=1;i<=V;i++){
dp[0][i]=0;
}
//状态转移;
for(int i=1;i<=n;i++){
for(int j=w[i];j<=V;j++){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+c[i]);
}
}
printf("%d\n",dp[n][V]);
return 0;
}