洛谷P5020 货币系统(NOIP2018提高组 D1T2)题解 完全背包

题目链接:https://www.luogu.com.cn/problem/P5020

解题思路:

这道题目就是说,如果有一种货币可以表示成其他若干货币的和(比如第一组样例中 \(6=2 \times 3,19=3 \times 3 + 10\))就可以去掉(所以 \(6\)\(19\) 都可以去掉)。

所以这就是一道完全背包问题了。

实现代码如下:

#include 
using namespace std;
const int maxn = 25050;
int f[maxn], V, T, n, m, a[110];
void pack_comp(int c) {
    for (int i = c; i <= V; i ++)
        f[i] = max(f[i], f[i-c]+c);
}
int main() {
    scanf("%d", &T);
    while (T --) {
        scanf("%d", &n);
        for (int i = 1; i <= n; i ++) scanf("%d", a+i);
        sort(a+1, a+1+n);
        V = a[n];
        memset(f, 0, sizeof(f));
        m = 0;
        for (int i = 1; i <= n; i ++) {
            if (f[ a[i] ] == a[i]) ;
            else {
                m ++;
                pack_comp(a[i]);
            }
        }
        printf("%d\n", m);
    }
    return 0;
}

你可能感兴趣的:(洛谷P5020 货币系统(NOIP2018提高组 D1T2)题解 完全背包)