Link:

ARC060 传送门

C:

由于难以维护和更新平均数的值:

$Average->Sum/Num$

这样我们只要用$dp[i][j][sum]$维护前$i$个数中取$j$个,且和为$sum$的个数

最后统计$dp[n][k][k*a]$即可

 

这样就得到了$O(n^4)$的解法

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN=55;
int n,a,sum,dat[MAXN];
ll dp[MAXN][MAXN][MAXN*MAXN],res=0;

int main()
{
    scanf("%d%d",&n,&a);
    for(int i=1;i<=n;i++) scanf("%d",&dat[i]);
    
    dp[1][1][dat[1]]=1;sum=dat[1]+dat[2];
    for(int i=1;i<=n;i++) dp[i][0][0]=1;
    for(int i=2;i<=n;i++,sum+=dat[i])
        for(int j=1;j<=i;j++)
            for(int k=1;k<=sum;k++)
            {
                dp[i][j][k]=dp[i-1][j][k];
                if(k>=dat[i]) dp[i][j][k]+=dp[i-1][j-1][k-dat[i]];
            }
    
    for(int i=1;i<=n;i++) res+=dp[n][i][i*a];
    printf("%lld",res);
    return 0;
}
O(n^4)

相关文章: