本博客参考自这里

 

不是我说,我就觉得这题题目贼鸡儿难懂

所以只能看看别的博客如何解释这题题目的意思咯。

有n个程序,这n个程序运作产生m行代码,但是每个程序产生的BUG总和不能超过b,给出每个程序产生的代码,每行会产生ai个BUG,
问在总BUG不超过b的情况下,我们有几种产生bug的方法。
解释一下例一的几种情况
我用1,2,3代表程序,然后每个都是1个bug就不需要特地其他方法搞



一共十种情况
然后对dp进行分析,设立一个dp[j][k],j代表代码数m,k代表bug数b
然后写状态转移方程:dp[j][k] += dp[j-1][k-a[i]]
本行的bug为上一行的第k-a[i]列的和。(其实我觉得这是最难的一步啦,我也是看那位大佬的博客才明白的)
还要注意的是状态转移方程的入口dp[0][0] = 1

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll dp[555][555],a[555];
int main()
{
	int n,m,b,mod;
	ll sum = 0;
	scanf("%d%d%d%d",&n,&m,&b,&mod);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	dp[0][0] = 1;//入口哦 
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			for(int k=a[i];k<=b;k++)//是从a[i]开始的 
			{
				dp[j][k] += dp[j-1][k-a[i]];//状态转移方程 
				dp[j][k] %= mod;
			}
		}
	}
	for(int i=0;i<=b;i++)//小于b的bug数 
	{
		sum += dp[m][i];
		sum %= mod;
	}
	printf("%I64d",sum);
	return 0;
}

 

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll dp[555][555],a[555];
int main()
{
    int n,m,b,mod;
    ll sum = 0;
    scanf("%d%d%d%d",&n,&m,&b,&mod);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    dp[0][0] = 1;//入口哦 
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            for(int k=a[i];k<=b;k++)//是从a[i]开始的 
            {
                dp[j][k] += dp[j-1][k-a[i]];//状态转移方程 
                dp[j][k] %= mod;
            }
        }
    }
    for(int i=0;i<=b;i++)//小于b的bug数 
    {
        sum += dp[m][i];
        sum %= mod;
    }
    printf("%I64d",sum);
    return

posted on 2018-07-22 20:48  阙广壬辰  阅读(217)  评论(0编辑  收藏  举报