codeforces 1032E

题解:

你能确定的集合一定是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 }
View Code
原文地址:https://www.cnblogs.com/uuzlove/p/10628483.html