您的位置:首页 > 其它

CodeForces 543A - Writing Code DP 完全背包

2015-05-31 15:25 986 查看
有n个程序,这n个程序运作产生m行代码,但是每个程序产生的BUG总和不能超过b,

给出每个程序产生的代码,每行会产生ai个BUG,问在总BUG不超过b的情况下,

我们有几种选择方法思路:看懂了题意之后就是一个完全背包题了

定义dp[ i ][ j ][ k ] 表示前 i 个程序员,已经写了 j 行代码,

已经产生了 k 个 bugs 。

根据题意,得知第 i 个程序员会写 r 行代码,那么相当于

dp[ i ][ j ][ k ] += dp[i - 1][j - r][k - ra[ i ]]

Source Code:

/*************************************************************************
> File Name: code03.cpp
> Author: Jeremy Wu
> Created Time: Sun 31 May 2015 02:37:07 PM CST
************************************************************************/

#include <iostream>

using namespace std;

const int N = 555;
int a
;
int dp[2]

;

int main () {
int i, j, k, l, m, n, bl, bugs, md;

cin >> n >> bl >> bugs >> md;
for (i = 0; i < n; ++i) cin >> a[i];
dp[0][0][0] = 1;

for (int it = 1; it <= n; ++it) {
i = it & 1;
for (j = 0; j <= bl; ++j) {
for (k = 0; k <= bugs; ++k) {
dp[i][j][k] = dp[i ^ 1][j][k];
if (j > 0 && k >= a[it - 1]) {
dp[i][j][k] += dp[i][j - 1][k - a[it - 1]];
}
while (dp[i][j][k] >= md) {
dp[i][j][k] -= md;
}
}
}
}

int ans = 0;
for (i = 0; i <= bugs; ++i) {
ans += dp[n & 1][bl][i];
while (ans >= md) {
ans -= md;
}
}
cout << ans << endl;

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