题目大意:有n个程序员,第i个人一行代码的bug数为ai。公司要写m行代码,问代码中bug量不超过b的方案数对mod取余的结果。
题解:把一个人写一行代码看作一个物品,这样就成了n类物品的完全背包问题,且有两个代价,一个是需要写的代码量m,一个是bug数b
1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 #include<climits>
5 #include<cstring>
6 using namespace std;
7 int v[501];
8 int f[501][501];
9 int main()
10 {
11 int n,m,b,mod;
12 scanf("%d%d%d%d",&n,&m,&b,&mod);
13 for(int i=1;i<=n;i++)
14 {
15 scanf("%d",&v[i]);
16 }
17 memset(f,0,sizeof(f));
18 f[0][0]=1;
19 for(int i=1;i<=n;i++)
20 {
21 for(int j=1;j<=m;j++)
22 {
23 for(int k=v[i];k<=b;k++)
24 {
25 f[j][k]+=f[j-1][k-v[i]];
26 f[j][k]%=mod;
27 }
28 }
29 }
30 int res=0;
31 for(int i=0;i<=b;i++)
32 {
33 res+=f[m][i];
34 res%=mod;
35 }
36 printf("%d\n",res);
37 return 0;
38 }