硬币
题目要求硬币的数量有限制,所以可以开 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; }
本文来自博客园,作者:樱雪喵,转载请注明原文链接:https://www.cnblogs.com/ying-xue/p/ying-bi.html