状态表示
f[j]表示可以组成j的方法数;
状态转移
f[j]+=f[j-v[i]];
C++代码
#include<bits/stdc++.h>
using namespace std;
const int N=110,M=30000;
int f[M],v[N];
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>v[i];
sort(v+1,v+n+1);
memset(f,0,sizeof(f));
f[0]=1;
int res=0,m=v[n];
for(int i=1;i<=n;i++)
{
if(f[v[i]]==0) res++;
for(int j=v[i];j<=m;j++)
{
f[j]+=f[j-v[i]];
}
}
cout<<res<<endl;
}
return 0;
}