• CodeForces 543A


    有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;
    }
  • 相关阅读:
    有序表的合并---顺序表实现
    有序表的合并---链表实现
    双向链表操作
    有序表的合并-用链表操作
    C语言单链表操作
    c语言顺序表操作
    c语言 取余 % 和除法 / 的应用技巧 (在取位数方面的)
    JS打印表格(HTML定义格式)
    富文本编辑器(php)
    利用formdata异步上传图片并预览图片
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/4542017.html
Copyright © 2020-2023  润新知