本博客参考自这里
不是我说,我就觉得这题题目贼鸡儿难懂
所以只能看看别的博客如何解释这题题目的意思咯。
有n个程序,这n个程序运作产生m行代码,但是每个程序产生的BUG总和不能超过b,给出每个程序产生的代码,每行会产生ai个BUG,
问在总BUG不超过b的情况下,我们有几种产生bug的方法。
解释一下例一的几种情况
我用1,2,3代表程序,然后每个都是1个bug就不需要特地其他方法搞
一共十种情况
然后对dp进行分析,设立一个dp[j][k],j代表代码数m,k代表bug数b
然后写状态转移方程:dp[j][k] += dp[j-1][k-a[i]]
本行的bug为上一行的第k-a[i]列的和。(其实我觉得这是最难的一步啦,我也是看那位大佬的博客才明白的)
还要注意的是状态转移方程的入口dp[0][0] = 1
#include<bits/stdc++.h> #define ll long long using namespace std; ll dp[555][555],a[555]; int main() { int n,m,b,mod; ll sum = 0; scanf("%d%d%d%d",&n,&m,&b,&mod); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } dp[0][0] = 1;//入口哦 for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { for(int k=a[i];k<=b;k++)//是从a[i]开始的 { dp[j][k] += dp[j-1][k-a[i]];//状态转移方程 dp[j][k] %= mod; } } } for(int i=0;i<=b;i++)//小于b的bug数 { sum += dp[m][i]; sum %= mod; } printf("%I64d",sum); return 0; }
#include<bits/stdc++.h> #define ll long long using namespace std; ll dp[555][555],a[555]; int main() { int n,m,b,mod; ll sum = 0; scanf("%d%d%d%d",&n,&m,&b,&mod); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } dp[0][0] = 1;//入口哦 for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { for(int k=a[i];k<=b;k++)//是从a[i]开始的 { dp[j][k] += dp[j-1][k-a[i]];//状态转移方程 dp[j][k] %= mod; } } } for(int i=0;i<=b;i++)//小于b的bug数 { sum += dp[m][i]; sum %= mod; } printf("%I64d",sum); return