正题
题目链接:https://www.luogu.com.cn/problem/P5020
题目大意
定义S(A)S(A)S(A)表示集合AAA内的若干个数字和(可以重复使用)可以表示的集合
nnn个数的集合FFF,求一个最小的集合G⊆FG\subseteq FG⊆F且S(F)=S(G)S(F)=S(G)S(F)=S(G)。
解题思路
对于一个数字a∈Fa\in Fa∈F如果a∈S(F)a\in S(F)a∈S(F)那么显然a∉Ga\notin Ga∈/G。
对于一个数字a∉Fa\notin Fa∈/F那么a∉Ga\notin Ga∈/G。因为如果a∉S(F)a\notin S(F)a∈/S(F)那么aaa一定不能在GGG,如果a∈S(F)a\in S(F)a∈S(F)且a∉Fa\notin Fa∈/F那么FFF中一定有更小的数能表示出aaa,而这些数也需要在S(G)S(G)S(G)中所以这个aaa是一定不需要选的。
所以背包即可,时间复杂度O(Tn∗max{ai})O(Tn*max\{a_i\})O(Tn∗max{ai})
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n,ans,a[110],f[30000];
int main()
{scanf("%d",&T);while(T--){scanf("%d",&n);ans=0;for(int i=1;i<=n;i++)scanf("%d",&a[i]);memset(f,0,sizeof(f));sort(a+1,a+1+n);f[0]=1;for(int i=1;i<=n;i++){if(!f[a[i]])ans++;for(int j=a[i];j<=a[n];j++)f[j]|=f[j-a[i]];}printf("%d\n",ans);}
}