给定n种硬币,其中第 i种硬币的面值为 Ai,共有p iC
个。
从中选出若干个硬币,把面值相加,若结果为sS
,则称“面值sS
能被拼成”。
求 1∼M
1~M之间能被拼成的面值有多少个。
#include <iostream>
#include <cstring>
using namespace std;
const int M=1e5+2;
int n,m,f[M],a[102],p[102];
void solve(){
int i,j;
memset(f,0,sizeof f);
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++) cin>>p[i];
f[0]=1;
for(i=1;i<=n;i++){
int t=p[i];
for(int k=1;k<=t;k<<=1){
for(j=m;j>=a[i]*k;j--)
f[j]|=f[j-a[i]*k];
t-=k;
}
if(t)
for(j=m;j>=a[i]*t;j--)
f[j]=max(f[j],f[j-a[i]*t]);
}
int cnt =0;
for(j=1;j<=m;j++) if(f[j]) cnt++;
cout<<cnt<<endl;
}
int main(){
while(cin>>n>>m,n&&m) solve();
}
浙公网安备 33010602011771号