#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int T,N,VM,v[105],c[105],dp[30000];
const int inf=100000000;
void ozbackpack(int cost,int weight)
{
for(int j=T+VM;j>=cost;j--)
dp[j]=min(dp[j-cost]+weight,dp[j]);
}
void combackpack(int cost,int weight)
{
for(int j=T+VM+cost;j>=0;j--)
dp[j]=min(dp[j],dp[j-cost]+weight);
}
int mulbackpack()
{
for(int i=1;i<=T+VM;i++)
dp[i]=inf;
dp[0]=0;
for(int i=1;i<=2*N;i++)
{
if(i<=N)
{
int k=1;
while(k<c[i])
{
ozbackpack(k*v[i],k);
c[i]-=k; k*=2;
}
ozbackpack(c[i]*v[i],c[i]);
}
else
combackpack(-v[i-N],1);
}
if(dp[T]==inf) return -1;
else return dp[T];
}
int main()
{
// freopen("test.txt","r",stdin);
scanf("%d%d",&N,&T);
VM=0;
for(int i=1;i<=N;i++)
{
scanf("%d",&v[i]);
VM=max(VM,v[i]);
}
VM*=VM;
for(int i=1;i<=N;i++)
scanf("%d",&c[i]);
printf("%d\n",mulbackpack());
return 0;
}
付钱时为多重背包,找钱时将其等效成价值为负的物品进行完全背包。