题意:有n个程序员,第i个程序员每行会有ai个bug,然后让你按着顺序安排程序员,问你有多少种安排方法,可以使得写m行的bug最多b个
思路:
dp[i][j]表示写i行bug数有j个的方法数
转移方程和背包问题类似
最后扫一遍统计一下就好
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 500+10; 5 6 int a[maxn],dp[maxn][maxn]; 7 8 int main(){ 9 int n,m,b,mod; 10 cin >> n >> m >> b >> mod; 11 for(int i=1; i<=n; i++) 12 cin >> a[i]; 13 14 dp[0][0] = 1; 15 for(int k=1; k<=n; k++) 16 for(int i=1; i<=m; i++) 17 for(int j=a[k]; j<=b; j++) 18 dp[i][j] = (dp[i][j] + dp[i-1][j-a[k]]) % mod; 19 long long ans = 0; 20 for(int i=0; i<=b; i++) 21 ans = (ans+dp[m][i])%mod; 22 cout << ans << endl; 23 }