CodeForces 543A - Writing Code DP 完全背包

有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[N];
int dp[2][N][N];

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;
}
时间: 2024-10-04 20:46:06

CodeForces 543A - Writing Code DP 完全背包的相关文章

Codeforces 543A Writing Code

A. Writing Code Programmers working on a large project have just received a task to write exactly m lines of code. There are n programmers working on a project, the i-th of them makes exactly ai bugs in every line of code that he writes. Let's call a

!CodeForces 543A Writing Code --DP--(三维dp,滚动数组)

题意:n个程序员一起写m行代码,第i个程序员每写一行有a[i]个bug,求总bug不超过b的分配方案有多少种 分析:这题很像完全背包,不过求的不是最大/最小bug数,求的是bug数小于上限的分配方案.所以这题要用三维dp dp[i][j][k]表示前i个个程序员总共写了j行代码产生了k个bug时的plan数,这题有两种转移:1)第i个程序员再写一行:2)换第i+1号程序员写 所以方程:dp[i][j][k]=dp[i-1][j][k]+dp[i][j-1][k-a[i]],注意:程序员可能一行都

背包DP || Codeforces 544C Writing Code

程序员写bug的故事23333 题意:n个程序员,一共写m行程序,最多产生b个bug,问方案数 思路:f[i][j]表示写了i行,产生了j个bug的方案数,因为每个人都是可以独立的,所以i循环到n都做一遍 f[i][j] += f[i-1][j-a[i]] 在前一行  i 的 a[i] 个bug还没有写上去的情况数 #include <iostream> #include <cstdio> #include <algorithm> using namespace std

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

题目传送门 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 内存限制,

Writing Code

Time Limit:3000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 543A Description Programmers working on a large project have just received a task to write exactly m lines of code. There are n programmer

USACO Money Systems Dp 01背包

一道经典的Dp..01背包 定义dp[i] 为需要构造的数字为i 的所有方法数 一开始的时候是这么想的 for(i = 1; i <= N; ++i){ for(j = 1; j <= V; ++j){ if(i - a[j] > 0){ dp[i] += dp[i - a[j]]; } } } 状态存在冗余, 输出的时候答案肯定不对 但只需要改一下两个for循环的顺序即可. Source Code: /* ID: wushuai2 PROG: money LANG: C++ */ //

poj 3345 Bribing FIPA 【树形dp + 01背包】

Bribing FIPA Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4274   Accepted: 1337 Description There is going to be a voting at FIPA (Fédération Internationale de Programmation Association) to determine the host of the next IPWC (Interna

codeforces 148D 【概率dp】

题目链接: codeforces 148D Bag of mice 题意:一个包里面有w只白老鼠和b只黑老鼠,公主与龙依次从包中拿老鼠,每次取一只,当龙拿时还会从包中溜走一只,先拿到老鼠的获胜,当背包中没老鼠时且之前没人拿到白老鼠则龙获胜,问公主获胜的概率是多少. 题解: 设dp[i][j]为背包中有i只白老鼠j只黑老鼠时公主获胜的概率 则公主获胜的情况分成三种: 1.直接拿到白老鼠 p1=i/(i+j) 2.公主拿到黑老鼠,龙拿到黑老鼠,逃跑一只黑老鼠 p2=(j/(i+j)) ((j-1)/

poj1384——dp,完全背包

POJ 1384  dp,完全背包 Piggy-Bank Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8404   Accepted: 4082 Description Before ACM can do anything, a budget must be prepared and the necessary financial support obtained. The main income for this a