货币系统
一个系统中如果有相同的面额显然是不划算的,因此可以用一个面额集合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;
}