NOIP2018 货币系统

时间:2025-01-02 21:36:26

题面

思路

先分析一下,a集合的子集肯定不存在可以用它来表示的数,a集合是不能够表示的。

所以问题简化了成为选出a的一个子集(个数最少),能够表达a集合所有能表达的数。

接下来继续分析

如:1 2 4

1没有两集合内数可以表达,留下

2=1+1 所以2删去

3=2+1 所以1删去,3可以被表达(可当做集合内数)

4=1+3 所以4删去

只剩1了,就输出1。

代码

 // luogu-judger-enable-o2
 #include<bits/stdc++.h>
 using namespace std;
 ],a[];
 int main()
 {
     scanf("%d",&T);
     while (T--)
     {
        memset(tag,,sizeof(tag));
        scanf("%d",&n);
        ;i<=n;i++)
        {
            scanf("%d",&a[i]);
            tag[a[i]]=-;
        }
        sort(a+,a+n+);
        ;i<=a[n];i++)
        {
            )
            {
                ;j<=n;j++)
                {
                 ;
                }
            }
        }
        ;
        ;i<=n;i++)
         ) ans++;
        cout<<ans<<endl;
     }
     ;
 }