题意

组数据,有 种货币,每种货币有无限量,求最少的货币种类,使得所有种类的货币可以被表示。

分析

先将货币数值排序,如果 可以被前面的表示,那么 显然没用了。如果没被表示,就显然必须加入货币系统。
怎么看能不能被表示呢?这不就是个背包吗=。=
复杂度

代码如下

#include <bits/stdc++.h>
#define N 105
using namespace std;
typedef long long LL;
LL z = 1;
int read(){
    int x, f = 1;
    char ch;
    while(ch = getchar(), ch < '0' || ch > '9') if(ch == '-') f = -1;
    x = ch - '0';
    while(ch = getchar(), ch >= '0' && ch <= '9') x = x * 10 + ch - 48;
    return x * f;
}
int ksm(int a, int b, int p){
    int s = 1;
    while(b){
        if(b & 1) s = z * s * a % p;
        a = z * a * a % p;
        b >>= 1;
    }
    return s;
}
int a[N], f[25005];
int main(){
    int i, j, n, m, T, ans;
    T = read();
    while(T--){
        n = read();
        for(i = 1; i <= n; i++) a[i] = read();
        sort(a + 1, a + i);
        memset(f, 0, sizeof(f));
        f[0] = 1; ans = 0;
        for(i = 1; i <= n; i++){
            if(f[a[i]]) continue;
            ans++;
            for(j = a[i]; j <= 25000; j++) f[j] |= f[j - a[i]];
        }
        printf("%d\n", ans);
    }
    return 0;
}