给定n种硬币,其中第 i种硬币的面值为 Ai,共有p iCi

个。

从中选出若干个硬币,把面值相加,若结果为sS

,则称“面值sS

能被拼成”。

1M

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();
 }
 
 
 
 
 
 

 

posted on 2023-02-27 15:23  towboat  阅读(24)  评论(0)    收藏  举报