题意:有n个人敲m行代码,每个人每行都会出现固定数目的bug,要求bug数不超过b,求有多少种方式。
思路:先循环n个人,dp[i][j]表示敲了i行,出现j个bug的情况数,每次加上这个人的一行,一直递推到最后。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int T,t,n,m,K,num[510];
ll dp[1010][1010],MOD,ans;
int main()
{
int i,j,k,a,b,p;
scanf("%d%d%d%I64d",&n,&m,&K,&MOD);
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=1;i<=n;i++)
for(j=0;j<m;j++)
for(k=0;k<=K-num[i];k++)
dp[j+1][k+num[i]]=(dp[j+1][k+num[i]]+dp[j][k])%MOD;
for(k=0;k<=K;k++)
ans+=dp[m][k];
ans%=MOD;
printf("%I64d\n",ans);
}