#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 30;
int n,V,maxValue=0;
int w[maxn], c[maxn];
void DFS(int index, int sumw,int sumc){
/* //死胡同
if(index==n){
if(sumw<=V&&sumc>=maxValue){
maxValue = sumc;
}
return;
}
//岔道口
DFS(index+1,sumw,sumc);//不选,处理下一个
DFS(index+1,sumw+w[index],sumc+c[index]);*/
//sumw<=V加入岔道口,
if(index ==n)return;
DFS(index+1,sumw,sumc);//不选,处理下一个
//选上,并且不超过v,才可以继续
if(sumw+w[index]<=V){
if(sumc+c[index]>maxValue){//大于最大的才更新重量呢
maxValue = sumc+c[index];
}
DFS(index+1,sumw+w[index],sumc+c[index]);
}
//通过限制条件,节省节省DFS计算量的方法叫剪枝
/*测试数据
5 8
3 5 1 2 2
4 5 2 1 3
结果10
*/
}
int main(){
cin>>n>>V;
for(int i=0;i<n;i++){
cin>>w[i];
}
for(int i=0;i<n;i++){
cin>>c[i];
}
DFS(0,0,0);
cout<<maxValue<<endl;
return 0;
}