#include <iostream>
#include <cstring>
using namespace std;
const int Max = 100;
int N,W;
int w[Max],v[Max],num[Max];
int f[Max];
void ZeroOnePack(int nweight,int nvalue)
{
for(int j=W;j>=nweight;j--)
f[j]=max(f[j],f[j-nweight]+nvalue);
}
void CompletePack(int nweight,int nvalue)
{
for(int j=nweight;j<=W;j++)
f[j]=max(f[j],f[j-nweight]+nvalue);
}
int MultiKnapsack()
{
memset(f,0,sizeof(f));
for(int i=1;i<=N;i++)
{
if(w[i]*num[i]>=W){
CompletePack(w[i],v[i]);
}else{
int k=1,cnt=num[i];
while(k<=cnt){
ZeroOnePack(k*w[i],k*v[i]);
cnt-=k;
k*=k;
}
ZeroOnePack(cnt*w[i],cnt*v[i]);
}
}
return f[W];
}
int main()
{
cin>>N>>W;
for(int i=1;i<=N;i++) cin>>w[i];
for(int i=1;i<=N;i++) cin>>v[i];
for(int i=1;i<=N;i++) cin>>num[i];
cout<<MultiKnapsack()<<endl;
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
const int Max = 100;
int N,W;
int w[Max],v[Max],num[Max];
int f[Max][Max];
int MultiKnapsack()
{
memset(f,0,sizeof(f));
for(int i=1;i<=N;i++)
{
for(int j=w[i];j<=W;j++)
{
int cnt = min(num[i],j/w[i]);
for(int k=0;k<=cnt;k++)
{
f[i][j]=max(f[i][j],f[i-1][j-k*w[i]]+k*v[i]);
}
}
}
return f[N][W];
}
int main()
{
cin>>N>>W;
for(int i=1;i<=N;i++) cin>>w[i];
for(int i=1;i<=N;i++) cin>>v[i];
for(int i=1;i<=N;i++) cin>>num[i];
cout<<MultiKnapsack()<<endl;
return 0;
}