题解:若存在一个货币系统的简化拥有与原货币系统不同的货币,先讨论只多出一种货币的情况,假设多出来的是A,那么x*A必然可以被原货币系统表示(x表示大素数),也就是说原货币系统中必然有A的约数B,添加A不如保留B,所以一个货币系统的简化一定不会添加其它货币
考虑使m尽可能小,那就要让大的面值尽可能多的能被小的面值凑出来
用dp[i]表示i这个面值能否被表示出来,先把面值排序,然后从小到大扫,如果能被表示就跳过,否则从0循环到maxn,对每个面值进行判断能否表示即可。

代码:

#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 110;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1e9+7;
using namespace std;
int a[maxn];
int dp[25010];
int main()
{
    int t;
    cin>>t;
    while (t--){
        int n;
        cin>>n;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        dp[0]=1;
        int ans=n;
        for(int i=1;i<=n;i++){
            if(dp[a[i]]){
                ans--;
                continue;
            }
            for(int j=a[i];j<=a[n];j++){
                dp[j]=dp[j]+dp[j-a[i]];
            }
        }
        printf("%d\n",ans);
    }
    return  0;
}