题意:
有n个人,要写m行代码,第i个人每写一行会出现ai个bug,每个人可以写任意行,但总bug数不能超过b个,求总方案数
思路:
套用完全背包模板,人即是物品,每个人贡献的重量是ai,贡献的价值是1,总共不超过b个bug即是总重量,即求价值为m且总重量不超过b的全部方案之和
dp[i][j]表示,写第i行,且当前剩余空间为j时的总方案数
状态转移方程:dp[i][j]=(dp[i][j]+dp[i-1][j-a[i] ] )
代码:
#include <iostream>
using namespace std;
long long dp[600][600]; //防止溢出,直接开long long
long long a[600];
int main()
{
int n,m,b,mod;
long long ans=0;
cin>>n>>m>>b>>mod;
for(int i=1;i<=n;i++)
cin>>a[i];
dp[0][0]=1; //初始化
for(int i=1;i<=n;i++)
{
if(a[i]>b) continue;
for(int j=1;j<=m;j++)
{
for(int k=a[i];k<=b;k++)
{
dp[j][k]=(dp[j][k]+dp[j-1][k-a[i]])%mod;
}
}
}
for(int i=0;i<=b;i++) //注意,可能存在a[i]=0的情况,此时可能有b=0,因此最后计算时要考虑进去
ans=(ans+dp[m][i])%mod;
cout<<ans<<endl;
return 0;
}