不难证明其中b集合中的数一定属于a集合所求的就是将a集合中能用剩下的数表示出来的数的个数
先将集合中的数排序,
//通过简单证明我们不难发现B集合是属于A集合的
//所以这道题就是要求在A集合中一共有多少个数可以被A集合中的数表示出来
#include<bits/stdc++.h>
using namespace std;
int a[110];
int T,n;
int ans;
bool vis[25010];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
ans=0;
memset(a,0,sizeof(a));
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
if(vis[a[i]]) continue;
vis[a[i]]=true;
ans++;
for(int k=a[i];k<=a[n];k++){
vis[k]|=vis[k-a[i]];
}
}
printf("%d\n",ans);
}
return 0;
}
其中最小的必选,就是一个完全背包问题后面的数字被标记了就不选