【NOIP2018 提高组】货币系统
本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
题目:传送门
因为硬币可以重复使用无限次,我们可以知道这是一道完全背包
记flag[j]表示j能够被构成,我们只需要把不能够构成的累加即可
我们必须先从小到大排序
code:
#include <bits/stdc++.h> using namespace std; int t, n; int a[110]; bool flag[50010]; int main() { freopen("money.in", "r", stdin); freopen("money.out", "w", stdout); scanf("%d", &t); for (int test = 1; test <= t; test++) { memset(flag, false, sizeof(flag)); int ans = 0, maxn = INT_MIN; scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]), maxn = max(maxn, a[i]); sort(a + 1, a + n + 1); flag[0] = true; for (int i = 1; i <= n; i++) { if (!flag[a[i]]) ans++; for (int j = 0; j <= maxn; j++) if (flag[j]) flag[j + a[i]] = true; } printf("%d\n", ans); } return 0; }