Link:
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; }