標籤:
題目傳送門
1 /* 2 題意:n個程式員,每個人每行寫a[i]個bug,現在寫m行,最多出現b個bug,問可能的方案有幾個 3 完全背包:dp[i][j][k] 表示i個人,j行,k個bug dp[0][0][0] = 1 表示不選擇人的時候所有的bug的種類犯錯誤都只有一種 4 dp[i][j][k] += dp[i%2][j-1][k-a[i]]; 5 錯誤示範:dp[i][j][k] += dp[i-1][j-l][k-l*a[i]]; 其實要從上一行的狀態推出,即少一行 6 記憶體限制,滾動數組使用 7 詳細解釋:http://www.cnblogs.com/wikioibai/p/4487409.html 8 */ 9 #include <cstdio>10 #include <algorithm>11 #include <cstring>12 #include <string>13 #include <cmath>14 using namespace std;15 16 const int MAXN = 5e2 + 10;17 const int INF = 0x3f3f3f3f;18 int a[MAXN];19 int dp[2][MAXN][MAXN];20 21 int main(void) //Codeforces Round #302 (Div. 2) C Writing Code22 {23 //freopen ("C.in", "r", stdin);24 25 int n, m, b;26 long long mod;27 while (scanf ("%d%d%d%I64d", &n, &m, &b, &mod) == 4)28 {29 memset (dp, 0, sizeof (dp));30 for (int i=1; i<=n; ++i) scanf ("%d", &a[i]);31 32 dp[0][0][0] = 1;33 for (int i=1; i<=n; ++i)34 {35 for (int j=0; j<=m; ++j)36 {37 for (int k=0; k<=b; ++k)38 {39 dp[i%2][j][k] = dp[(i+1)%2][j][k];40 if (j > 0 && k >= a[i]) dp[i%2][j][k] = (dp[i%2][j][k] + dp[i%2][j-1][k-a[i]]) % mod;41 }42 }43 }44 45 long long ans = 0;46 for (int i=0; i<=b; ++i) ans = (ans + dp[n%2][m][i]) % mod;47 printf ("%I64d\n", ans);48 }49 50 return 0;51 }
完全背包 Codeforces Round #302 (Div. 2) C Writing Code