首页 > 其他 > 详细

codeforces 1032E

时间:2019-03-30 19:14:53      阅读:151      评论:0      收藏:0      [点我收藏+]

题解:

你能确定的集合一定是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",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\n",ans);
44     return 0;
45 }
View Code

 

codeforces 1032E

原文:https://www.cnblogs.com/uuzlove/p/10628483.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!