cf#302 C. Writing Code dp

点击打开链接

题意:有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 }
原文地址:https://www.cnblogs.com/yxg123123/p/6827731.html