我们知道如果x能被前i个数组成,且组成x 的数当中包含a[i]那么(x-a[i])也必然能被前i个数来组成,那么我们很容易想到定义f(x)表示x能否被组成,那么根据上面的想法显然有f(x)=f(x)|f(x−a[i])
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int n,T,ans; int f[25005],a[105]; int main() { scanf("%d",&T); while(T--) { memset(f,0,sizeof(f)); scanf("%d",&n);ans=n; for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); f[0]=1; for(int i=1;i<=n;i++) { if(f[a[i]]) { ans--; continue; } for(int j=a[i];j<=a[n];j++) f[j]=f[j]|f[j-a[i]]; } printf("%d\n",ans); } return 0; }