把m写成了n,dp一直调不出来,囧rz,dp[i][j]表示前i天bug为j的方案数,希望今后比赛能细心点。
#include <bits/stdc++.h>
#define foreach(it,v) for(__typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)
using namespace std;
typedef long long ll;
const int maxn = 5e2 + 5;
int a[maxn],mod,b,n,m;
ll dp[maxn][maxn];
int main()
{
while(cin>>n>>m>>b>>mod) {
memset(dp,0,sizeof dp);
for(int i = 1; i <= n; i++)cin>>a[i];
dp[0][0] = 1;
for(int i = 1; i <= n; i++) {
for(int k = 1; k <= m; k++) {
for(int j = a[i]; j <= b; j++)
dp[k][j] += dp[k-1][j-a[i]],dp[k][j]%=mod;
}
}
ll res = 0;
for(int i = 0; i <= b; i++)res += dp[m][i];
cout<<res%mod<<endl;
}
return 0;
}