给定n种硬币,其中第 i种硬币的面值为 Ai,共有p iCi
个。
从中选出若干个硬币,把面值相加,若结果为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(); }
标签:sS,硬币,int,面值,281,include,acwing From: https://www.cnblogs.com/towboa/p/17159859.html