给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数。
Input
多组数据,每组数据前两个数字为n,m。n表示硬币种类数,m为最大面额,之后前n个数为每种硬币的面额,后n个数为相应每种硬币的个数。 (n<=100,m<=100000,面额<=100000,每种个数<=1000)
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e5+6;
int is[maxn],sum[maxn],v[maxn],c[maxn];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,m;
while(cin>>n>>m){
if(n==0&&m==0)break;
for(int i=1;i<=n;i++)cin>>v[i];
for(int i=1;i<=n;i++)cin>>c[i];
memset(is,0,sizeof(is));
is[0]=1;//is[]表明这个状态是否存在
int ans=0;
for(int i=1;i<=n;i++){
memset(sum,0,sizeof(sum));
for(int j=v[i];j<=m;j++){
if(!is[j]&&is[j-v[i]]&&sum[j-v[i]]<c[i]){
is[j]=1;
sum[j]=sum[j-v[i]]+1;
ans++;
}
}
}
cout<<ans<<endl;
}
}