CodeForces 543A Writing Code(DP)

来源:互联网 发布:莱安娜怎么死的知乎 编辑:程序博客网 时间:2024/05/16 05:23

题目链接:http://codeforces.com/problemset/problem/543/A


题意:安排n个人写m行代码,每人每行会出现a[i]个bug,问最多出现k个bug的方案数


思路:令dp(i, j, k)表示前i个人写j行代码未超过k个的方案数,然后就可以类似背包进行转移并降掉一维的空间复杂度


#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <utility>#include <cmath>#include <queue>#include <set>#include <map>#include <climits>#include <functional>#include <deque>#include <ctime>#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;const int maxn = 510;long long dp[maxn][maxn];int a[maxn];int main(){    int n, m, b, mod;    while (~scanf("%d%d%d%d", &n, &m, &b, &mod))    {        memset(dp, 0, sizeof(dp));        dp[0][0] = 1;        for(int i = 1; i <= n; i++)            scanf("%d", &a[i]);        for(int i = 1; i <= n; i++)            for(int j = 1; j <= m; j++)                for(int k = a[i]; k <= b; k++)                    dp[j][k] = (dp[j - 1][k - a[i]] + dp[j][k]) % mod;        int ans = 0;        for(int i = 0; i <= b; i++)            ans = (ans + dp[m][i]) % mod;        cout << ans << endl;    }    return 0;}


0 0
原创粉丝点击