AtCoder - 2037 (dp)

题意

https://vjudge.net/problem/AtCoder-2037

选一些数使得和的平均值等于a,问方案数。

思路

设dp[i][j]为选i个数和为j的方案数,如果当前选了x,那么dp[j+1][w+x]+=dp[j][w]。

令dp[0][0]=1,注意倒序遍历j

代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=55;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll dp[N][N*N];
int main()
{
    std::ios::sync_with_stdio(false);
    int n,a;
    cin>>n>>a;
    dp[0][0]=1;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        for(int j=i-1;j>=0;j--)
        for(int w=0;w<=N*j;w++)
        {
            dp[j+1][w+x]+=dp[j][w];
         //   cout<<j+1<<" "<<w+x<<" "<<dp[j+1][w+x]<<endl;
        }
    }
    ll ans=0;
    for(int i=1;i<=n;i++)
    {
        ans+=dp[i][i*a];
    }
    cout<<ans<<endl;
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/mcq1999/p/11833138.html