货币系统

货币系统
货币系统
货币系统
一个系统中如果有相同的面额显然是不划算的,因此可以用一个面额集合S来描述这个系统,并把a中重复的数 删除。假设给定的系统为集合 A。
简化操作就是一种面额ai如果能被其他的面额表示,就把这个ai删去。简化操作 只会产生等价,且这种操作不会无限进行下去。把不能进行简化操作的系统叫做最简系统。

#include<bits/stdc++.h>
#define ll long long
#define re register int
#define inf 0x3f3f3f3f
using namespace std;
inline ll read(){
    char c;
    ll x=0,w=1;
    for(c=getchar();c<'0'||c>'9';c=getchar()) if(c=='-') w=-1;
    for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
    return x*w;
}
ll t,n,a[105],vis[50005],ans,b[105],maxv;
inline ll max(ll x,ll y)
{
 return x>y?x:y;
}
int main()
{
    t=read();
    vis[0]=1;
    while(t--)
 {
        n=read();
        maxv=0;
        for(re i=1;i<=n;++i)
  {
            a[i]=read();
            maxv=max(maxv,a[i]);
        }
        for(re i=1;i<=maxv;++i) 
   vis[i]=0;
        ans=0;
        sort(a+1,a+n+1);
        for(re i=1;i<=n;++i)
  {
            if(!vis[a[i]])
   {
                for(re j=0;j<=maxv-a[i];++j) 
     if(vis[j]) 
      vis[j+a[i]]=1;
                ++ans;
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}