首先sort排序,看后面的数能不能被前面的数表示(xi=a1x1+a2x2+~~~+ai-1*xi-1)不能的话保存的数加一
#include<bits/stdc++.h>
using namespace std;
int m,n,ha[110],mp[110];
bool sf(int x,int z){
if(!z) return 1;
if((!(x%mp[z]))) return 0;
bool hahaha=1;
for(int y=0;hahaha&&y*mp[z]<=x;++y) hahaha&=sf(x-y*mp[z],z-1);
return hahaha;
}
int main(){
// freopen("money.in","r",stdin);
// freopen("money.out","w",stdout);
scanf("%d",&m);
while(m--){
scanf("%d",&n);
for(int z=1;z<=n;++z) scanf("%d",&ha[z]);
sort(ha+1,ha+n+1);
if(ha[1]==1){
printf("1\n");
continue;
}
for(int z=2;z<=n;++z) for(int y=1;y<z;++y) if(ha[y]&&(!(ha[z]%ha[y]))) ha[z]=0;
mp[0]=0;
mp[++mp[0]]=ha[1];
for(int z=2;z<=n;++z) if(sf(ha[z],mp[0])) mp[++mp[0]]=ha[z];
printf("%d\n",mp[0]);
}
}