print?/*
問一些硬幣能組合到的錢數有多少種?
多重背包 容量等於價值的算一種
*/
#include<stdio.h>
#include<string.h>
struct node
{
int w,v,c;
}wu[150];
int n,m;
int dp[101000];
void cpack(int c,int ww,int*d,int w)
{
int j;
for(j=c;j<=w;j++)
{
if((d[j-c]+ww)>d[j])
d[j]=d[j-c]+ww;
}
}
void znpack(int c,int ww,int*d,int w)
{
int j;
for(j=w;j>=c;j--)
{
if(d[j]<(d[j-c]+ww))
d[j]=d[j-c]+ww;
}
}
void mpack(int c,int ww,int nn,int*d,int w)
{
if(c*nn>=w)
{
cpack(c,ww,d,w);
return;
}
int k=1;
while(k<nn)
{
znpack(k*c,k*ww,d,w);
nn=nn-k;
k=k*2;
}
znpack(nn*c,nn*ww,d,w);
}
int main()
{
int i,ret;
while(scanf("%d%d",&n,&m),n+m)
{
ret=0;
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
scanf("%d",&wu[i].w);
wu[i].v=wu[i].w;
}
for(i=0;i<n;i++)
{
scanf("%d",&wu[i].c);
}
for(i=0;i<n;i++)
{
if(wu[i].c)
mpack(wu[i].w,wu[i].v,wu[i].c,dp,m);
}
for(i=1;i<=m;i++)
{
if(dp[i]&&dp[i]!=dp[i-1]) ret++;
}
printf("%d\n",ret);
}
return 0;
}
/*
問一些硬幣能組合到的錢數有多少種?
多重背包 容量等於價值的算一種
*/
#include<stdio.h>
#include<string.h>
struct node
{
int w,v,c;
}wu[150];
int n,m;
int dp[101000];
void cpack(int c,int ww,int*d,int w)
{
int j;
for(j=c;j<=w;j++)
{
if((d[j-c]+ww)>d[j])
d[j]=d[j-c]+ww;
}
}
void znpack(int c,int ww,int*d,int w)
{
int j;
for(j=w;j>=c;j--)
{
if(d[j]<(d[j-c]+ww))
d[j]=d[j-c]+ww;
}
}
void mpack(int c,int ww,int nn,int*d,int w)
{
if(c*nn>=w)
{
cpack(c,ww,d,w);
return;
}
int k=1;
while(k<nn)
{
znpack(k*c,k*ww,d,w);
nn=nn-k;
k=k*2;
}
znpack(nn*c,nn*ww,d,w);
}
int main()
{
int i,ret;
while(scanf("%d%d",&n,&m),n+m)
{
ret=0;
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
scanf("%d",&wu[i].w);
wu[i].v=wu[i].w;
}
for(i=0;i<n;i++)
{
scanf("%d",&wu[i].c);
}
for(i=0;i<n;i++)
{
if(wu[i].c)
mpack(wu[i].w,wu[i].v,wu[i].c,dp,m);
}
for(i=1;i<=m;i++)
{
if(dp[i]&&dp[i]!=dp[i-1]) ret++;
}
printf("%d\n",ret);
}
return 0;
}