#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1010;
int c[maxn],w[maxn];
int dp[maxn];
int main(){
int n,v;
cin>>n>>v;
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=n;i++){
for(int j=v;j>=c[i];j--){ //为了防止之前的结果影响之后的必须从尾部向前走,因为这是01背包一维数组,每种物品只能选择一个
dp[j]=max(dp[j],dp[j-c[i]]+w[i]); //在完全背包下可以从前往后走,因为物品的个数是无限个,而多重背包与01背包一般情况下都可以相互转换的,所以多重只是对物品分了类而已相同的物品在一个类中,数量多了几个
//01背包则没有分类这一说,都是一样的
}
}
printf("%d\n",dp[v]);
return 0;
}
class Solution
{
private int v[]; //价值
private int c[]; //数量
private int w[]; //体积
private int num; //物品的种数
private int k; //物品的总数
private int dp[]; //最大价值表
private int cnt; //背包的最大容量
private Scanner iner=new Scanner(System.in);
public int Selected()
{
for(int i=0;i<this.k;++i)
{
for(int j=this.cnt;j>=this.w[i];--j)
{
dp[j]=Math.max(dp[j], dp[j-this.w[i]]+this.v[i]);
}
}
return dp[this.cnt];
}
public Solution()
{
System.out.print("请输入背包的最大容量:");
this.cnt=iner.nextInt();
System.out.print("请输入物品的种数:");
this.num=iner.nextInt();
this.c=new int[this.num+100];
this.w=new int[this.num+100];
this.dp=new int[this.num+100];
this.v=new int[this.num+100];
System.out.print("请输入每种物品的价值体积及数量:");
for(int i=0;i<this.num;++i)
{
this.v[i]=iner.nextInt();
this.w[i]=iner.nextInt();
this.c[i]=iner.nextInt();
}
this.k=this.num;
for(int i=0;i<this.num;++i)
{
while(this.c[i]!=1)
{
this.v[k]=this.v[i];
this.w[k]=this.w[i];
this.c[i]--;
this.c[k]=this.c[i];
k++;
}
}
}
}