#include <iostream>
#include <string>
#include<cstring>
#include <stdlib.h>
#include<stdio.h>
using namespace std;
#define maxn 105
#define maxl 100005
int weight[maxn],c[maxn],f[maxl],user[maxl];
int main()
{
int i,j,n,m,ans;
while(scanf("%d%d",&n,&m)&&n&&m){
for(i=1;i<=n;i++)
scanf("%d",&weight[i]);
for(i=1;i<=n;i++)
scanf("%d",&c[i]);
memset(f,0,sizeof(f));
f[0]=1;ans=0;
for(i=1;i<=n;i++){
memset(user,0,sizeof(user));
for(j=weight[i];j<=m;j++){
if(!f[j]&&f[j-weight[i]]&&user[j-weight[i]]+1<=c[i]) //分别判断j这个和以前求过没有,j这个和是否可以通过第i种硬币和其他 //硬币的组合
f[j]=1;
user[j]=user[j-weight[i]]+1;
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}
题意:在给出硬币的价值和个数之后,在用多种硬币组合的方式求出m值以下有多少种可能的求和值
思路:用一个数组记录是否这个值已经之前被求过了,这里用数组f,用一个user数组来判断第i种硬币使用的次数是否不超过第i种硬币的数量