有n个人,要写m行代码,第i个人每写一行会出现ai个bug,每个人可以写任意行,但总bug数不能超过b个,求总方案数
dp[j][k] 表示有j行代码k个bug的方法数,
所有转移方程为:类似一维完全背包
dp[j + 1][k + a[i]] += dp[j][k]
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int dp[maxn][maxn];
int a[maxn];
int main() {
int n, m, b, mod;
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++) {
for (int j = 0; j <= m; j++) {
for (int k = 0; k <= b; k++) {
dp[j + 1][k + a[i]] += dp[j][k];
dp[j + 1][k + a[i]] %= mod;
}
}
}
int ans = 0;
for (int i = 0; i <= b; i++) {
ans += dp[m][i];
ans %= mod;
}
cout << ans << endl;
return 0;
} 
京公网安备 11010502036488号