cf-543-A.Writing Code-dp完全背包

这里写图片描述

题意:

有n个人,要写m行代码,第i个人每写一行会出现ai个bug,每个人可以写任意行,但总bug数不能超过b个,求总方案数

思路:

套用完全背包模板,人即是物品,每个人贡献的重量是ai,贡献的价值是1,总共不超过b个bug即是总重量,即求价值为m且总重量不超过b的全部方案之和
dp[i][j]表示,写第i行,且当前剩余空间为j时的总方案数
状态转移方程:dp[i][j]=(dp[i][j]+dp[i-1][j-a[i] ] )

代码:

#include <iostream>
using namespace std;

long long dp[600][600];        //防止溢出,直接开long long
long long a[600];
int main()
{
    int n,m,b,mod;
    long long ans=0;
    cin>>n>>m>>b>>mod;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    dp[0][0]=1;                    //初始化

    for(int i=1;i<=n;i++)
    {
        if(a[i]>b) continue;
        for(int j=1;j<=m;j++)
        {
            for(int k=a[i];k<=b;k++)
            {
                dp[j][k]=(dp[j][k]+dp[j-1][k-a[i]])%mod;
            }
        }
    }
    for(int i=0;i<=b;i++)              //注意,可能存在a[i]=0的情况,此时可能有b=0,因此最后计算时要考虑进去
        ans=(ans+dp[m][i])%mod;
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43093481/article/details/82430306