您的位置:首页 > 其它

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

2015-05-08 19:38 351 查看
题目传送门

 /*
题意:n个程序员,每个人每行写a[i]个bug,现在写m行,最多出现b个bug,问可能的方案有几个
完全背包:dp[i][j][k] 表示i个人,j行,k个bug    dp[0][0][0] = 1 表示不选择人的时候所有的bug的种类犯错误都只有一种
dp[i][j][k] += dp[i%2][j-1][k-a[i]];
错误示范:dp[i][j][k] += dp[i-1][j-l][k-l*a[i]];    其实要从上一行的状态推出,即少一行
内存限制,滚动数组使用
详细解释:http://www.cnblogs.com/wikioibai/p/4487409.html
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
using namespace std;

const int MAXN = 5e2 + 10;
const int INF = 0x3f3f3f3f;
int a[MAXN];
int dp[2][MAXN][MAXN];

int main(void)        //Codeforces Round #302 (Div. 2) C Writing Code
{
//freopen ("C.in", "r", stdin);

int n, m, b;
long long mod;
while (scanf ("%d%d%d%I64d", &n, &m, &b, &mod) == 4)
{
memset (dp, 0, sizeof (dp));
for (int i=1; i<=n; ++i)    scanf ("%d", &a[i]);

dp[0][0][0] = 1;
for (int i=1; i<=n; ++i)
{
for (int j=0; j<=m; ++j)
{
for (int k=0; k<=b; ++k)
{
dp[i%2][j][k] = dp[(i+1)%2][j][k];
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;
}
}
}

long long ans = 0;
for (int i=0; i<=b; ++i)    ans = (ans + dp[n%2][m][i]) % mod;
printf ("%I64d\n", ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: