码迷,mamicode.com
首页 > 其他好文 > 详细

完全背包 Codeforces Round #302 (Div. 2) C Writing Code

时间:2015-05-08 21:39:09      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

 

题目传送门

 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 Code
22 {
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

标签:

原文地址:http://www.cnblogs.com/Running-Time/p/4488696.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!