多重背包
f[i]代表价值为i的有没有被发现
used[value]代表,价值为value的时候第i枚硬币用了几个
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
#define SCAND(x) scanf("%d",&(x))
#define SCANS(x) scanf("%s",(x))
#define PRINTD(x) printf("%d",(x))
using namespace std;
const int INF=1<<30;
int w[111],c[111],used[111111],f[111111];
void memall()
{
memset(w,0,sizeof(w));
memset(c,0,sizeof(c));
memset(used,0,sizeof(used));
memset(f,0,sizeof(f));
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("H:/in.txt","r",stdin);
//freopen("H:/out.txt","w",stdout);
#endif
int n,m;
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
memall();
for(int i=0;i<n;i++)
SCAND(w[i]);
for(int i=0;i<n;i++)
SCAND(c[i]);
f[0]=1;
int sum=0;
for(int i=0;i<n;i++)
{
memset(used,0,sizeof(used));
for(int j=w[i];j<=m;j++)
{
if(!f[j]&&f[j-w[i]]&&used[j-w[i]]+1<=c[i])
{
f[j]=1;
used[j]=used[j-w[i]]+1;
sum++;
}
}
}
cout<<sum<<endl;
}
}