题解:
你能确定的集合一定是k个重量一样的,重量为m
然后考虑dp(j,k)为选了j个,重量和为k的方案,我们现在只需要判定唯一性,所以状态只有0,1,2三种
然后dp就行
坑点:1 1 1 1 1 2 2 2 2 2这种,可以全部确定
1 #include<bits/stdc++.h> 2 #define maxn 105 3 using namespace std; 4 int n; 5 int a[maxn]; 6 int f[maxn][maxn*maxn]; 7 int has[maxn]; 8 int main() 9 { 10 scanf("%d",&n); 11 for(int i=1;i<=n;++i)scanf("%d",&a[i]); 12 for(int i=1;i<=n;++i)has[a[i]]++; 13 for(int i=1;i<=100;++i) 14 { 15 for(int j=i+1;j<=100;++j) 16 { 17 if(has[i]+has[j]==n&&i*has[i]!=j*has[j]) 18 { 19 printf("%d ",n); 20 return 0; 21 } 22 } 23 } 24 f[0][0]=1; 25 for(int i=1;i<=100;++i)if(has[i]) 26 { 27 for(int j=n;j>=0;--j) 28 { 29 for(int k=10000;k>=0;--k) 30 { 31 for(int l=has[i];l;--l)if(k+i*l<=10000&&j+l<=n) 32 { 33 f[j+l][k+i*l]=min(2,f[j+l][k+i*l]+f[j][k]); 34 } 35 } 36 } 37 } 38 int ans=0; 39 for(int i=1;i<=100;++i) 40 { 41 for(int j=1;j<=has[i];++j)if(f[j][j*i]==1)ans=max(ans,j); 42 } 43 printf("%d ",ans); 44 return 0; 45 }