硬币
题解:
这是一道有限背包,基本思路与完全背包一致,不同的是,每种物品有固定的选择次数,那么我们限制选择的次数即可,标记可凑成的钱数为一
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt[100005],dp[100005],res;
struct node{
int price,num;
}coin[105];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&coin[i].price);
for(int i=1;i<=n;i++) scanf("%d",&coin[i].num);
dp[0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++) cnt[j]=0;
for(int j=coin[i].price;j<=m;j++){
if(dp[j-coin[i].price]&&!dp[j]){
if(cnt[j-coin[i].price]==coin[i].num) continue;;
dp[j]=1;
cnt[j]=cnt[j-coin[i].price]+1;
}
}
}
for(int i=1;i<=m;i++)
if(dp[i]) res++;
printf("%d",res);
return 0;
}