硬币

题目要求硬币的数量有限制,所以可以开  b 数组记录当前该物品所取的件数。

其中 b[j] 表示要想让 f[j] = 1 ,第 i 件物品至少需要 b[j] 个。

f[i] 表示 i 能否被表示出来,能则为 1 ,否则为 0 。

总结下自己的问题:

1. b 数组要清零。

2. f 数组要赋初值。

具体参见注释。

#include<bits/stdc++.h>
using namespace std;
int n,m,a[101],c[101],f[100001],b[100001],ans;
int main()
{
    f[0] = 1;//赋初值 
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= n;i ++) scanf("%d",&a[i]);
    for(int i = 1;i <= n;i ++) scanf("%d",&c[i]);
    for(int i = 1;i <= n;i ++)
    {
        memset(b,0,sizeof(b));//清零 
        for(int j = a[i];j <= m;j ++)
        {
            if(f[j-a[i]] == 0 || f[j] == 1) continue;//如果f[j-a[i]]不能被得到,那么返回。 
            if(b[j - a[i]] == c[i]) continue;//判断是否超过数量的限制。 
            b[j] = b[j - a[i]] + 1;f[j] ++;ans ++;//取的次数加一,并统计答案 
        }
    }
    cout<<ans;
    return 0;
}

 

posted @ 2020-12-04 20:42  樱雪喵  阅读(95)  评论(0编辑  收藏  举报