import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Vector;
public class _dfsNbfs {
static int n;
static int maxn=30;
static int []w=new int [maxn];static int []v=new int [maxn];
static int sumw,sumv,finalsumv,maxw;
static void DFS(int index,int sumw,int sumv) {
if(index==n) {
if(sumv>finalsumv) {
finalsumv=sumv;
}
return;
}else {
DFS(index+1,sumw,sumv);
if(sumw+w[index]<=maxw) {
DFS(index+1,sumw+w[index],sumv+v[index]);
}
}
}
static int []A=new int [maxn];
static Vector<Integer>temp;
static Vector<Integer> ans;
static int x=0,k=0;
static int sumSqumax=0;
static void DFS2(int index,int nowk,int sumn,int sumSqu) {
if(nowk==n&&sumn==x)
{
if(sumSqu>sumSqumax) {
sumSqumax=sumSqu;
ans=temp;
}
}
if(n==index||nowk>k||sumn>x) {
return;
}
temp.add(A[index]);
DFS2(index+1,nowk+1,sumn+A[index],sumSqu+A[index]*A[index]);
temp.removeElement(A[index]);
DFS2(index+1,nowk+1,sumn,sumSqu);
}
static class node{
int x;
int y;
int step;
node(){}
}
static int xz[]= {0,0,1,-1};
static int yz[]= {-1,1,0,0};
static boolean inq[][];
static boolean judge(int x,int y) {
if(x<0||x>=n||y<0||y>=n) return false;
else if(inq[x][y]=true) return false;
else return true;
}
static void BFS(int x,int y) {
Arrays.fill(inq, false);
Scanner cin=new Scanner(System.in);
Queue<node>q=new LinkedList<>();
node k=new node();
k.x=cin.nextInt();k.y=cin.nextInt();
cin.nextInt();
q.add(k);
inq[x][y]=true;
while(!q.isEmpty()){
node newnode=q.poll();
int newx,newy;
for(int i=0;i<4;i++) {
newx=newnode.x+xz[i];
newy=newnode.y+yz[i];
if(judge(newx,newy)) {
k.x=newx;k.y=newy;
q.add(k);
inq[newx][newy]=true;
}
}
}
}
static int BFS2(int x,int y) {
node T=new node();
node S=new node();
S.x=x;S.y=y;
Queue<node> q=new LinkedList<>();
q.add(S);
inq[x][y]=true;
while(!q.isEmpty()) {
node newnode=q.poll();
if(newnode.x==T.x&&newnode.y==T.y) {
return newnode.step;
}
for(int i=0;i<4;i++) {
int newx=newnode.x+xz[i];
int newy=newnode.y+yz[i];
if(judge(newx,newy)) {
newnode.x=newx;newnode.y=newy;
q.add(newnode);
inq[newx][newy]=true;
}
}
}
return -1;
}
public static void main(String []args) {
Scanner cin=new Scanner(System.in);
n=cin.nextInt();maxw=cin.nextInt();
for(int i=0;i<n;i++) {
w[i]=cin.nextInt();
}
for(int i=0;i<n;i++) {
v[i]=cin.nextInt();
}
DFS(0,0,0);
System.out.println(finalsumv);
}
}