zoukankan      html  css  js  c++  java
  • 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
Copyright © 2011-2022 走看看