#include <bits/stdc++.h>
#define LOCAL
#define ll long long
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0x7fffffff
//#define mod 1000000007
using namespace std;
/*
题意:
想法:完全背包
dp[i][j][k] += dp[i-1][j-1][k - a[i]];
用 dp[i][j][k] 来表示用前 i 个人写前 j 行code,总共产生了 k 个 bug(s)
*/
int dp[1009][1009];
int a[1009];
int main()
{
// freopen("date.in","r",stdin);
int n,m,b;
ll mod;
memset(dp,0,sizeof(dp));
scanf("%d%d%d%lld",&n,&m,&b,&mod);
for(int i = 1;i<=n;i++) scanf("%d",&a[i]);
dp[0][0] = 1;//第j行产生k个的方法数
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
for(int k = b;k>=a[i];k--)
{
dp[j][k] = (dp[j][k] + dp[j - 1][k - a[i]])%mod;
}
}
}
ll ans = 0;
for(int i = 0;i<=b;i++)
{
ans = (ans + dp[m][i])%mod;
}
printf("%lld\n",ans);
return 0;
}
#define LOCAL
#define ll long long
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0x7fffffff
//#define mod 1000000007
using namespace std;
/*
题意:
想法:完全背包
dp[i][j][k] += dp[i-1][j-1][k - a[i]];
用 dp[i][j][k] 来表示用前 i 个人写前 j 行code,总共产生了 k 个 bug(s)
*/
int dp[1009][1009];
int a[1009];
int main()
{
// freopen("date.in","r",stdin);
int n,m,b;
ll mod;
memset(dp,0,sizeof(dp));
scanf("%d%d%d%lld",&n,&m,&b,&mod);
for(int i = 1;i<=n;i++) scanf("%d",&a[i]);
dp[0][0] = 1;//第j行产生k个的方法数
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
for(int k = b;k>=a[i];k--)
{
dp[j][k] = (dp[j][k] + dp[j - 1][k - a[i]])%mod;
}
}
}
ll ans = 0;
for(int i = 0;i<=b;i++)
{
ans = (ans + dp[m][i])%mod;
}
printf("%lld\n",ans);
return 0;
}
本文通过一个具体的编程实例,介绍了如何使用完全背包算法解决程序员在编写代码时产生的bug数量问题。利用三维动态规划数组dp[i][j][k]来记录前i个人编写前j行代码所产生的k个bug的方法总数。
3万+

被折叠的 条评论
为什么被折叠?



