DP计数

来源:互联网 发布:怎么在手机淘宝买东西 编辑:程序博客网 时间:2024/05/17 07:10

题目地址

题目大意:n个人编写m行代码,允许整个代码最多有b个错误,给出每个人编写每行代码的错误个数,求有多少种方案满足条件,最后结果模mod

解题思路:类似多重背包的dp,dp[i][j]表示写到第i行代码时错误数为j的方案数

#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <string>#include <queue>#include <map>#include <list>#include <vector>using namespace std;const int maxn = 500+10;int num[maxn];long long dp[maxn][maxn];int main(){    int n,m,b;    long long mod;    scanf("%d%d%d%I64d",&n,&m,&b,&mod);    for(int i = 0; i < n; i++)    {        scanf("%d",&num[i]);        for(int j = 0; j <= m; j++)        {            for(int k = 0; k <= b; k++)            {                if(i == 0 && j*num[i] <= b)                    dp[j][j*num[i]] = 1;                else if(j+1 <= m  && k + num[i]<= b)                    dp[j+1][k+num[i]] = (dp[j+1][k+num[i]]+dp[j][k]) % mod;            }        }    }    long long ans = 0;    for(int i = 0; i <= b; i++)    {        ans = (ans + dp[m][i])%mod;    }    printf("%I64d\n",ans);    return 0;}


0 0
原创粉丝点击