题目大意:有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 }