codeforces 544C
题意:
给 定 n 、 m 和 b , 要 求 n 个 人 写 m 条 代 码 且 代 码 总 B U G 数 不 超 过 b 个 。 问 最 终 方 案 数 , 结 果 对 m o d 取 模 。 给定n、m和b,要求n个人写m条代码且代码总BUG数不超过b个。问最终方案数,结果对mod取模。 给定n、m和b,要求n个人写m条代码且代码总BUG数不超过b个。问最终方案数,结果对mod取模。
题解:
将
第
i
个
人
写
代
码
产
生
的
B
U
G
数
视
为
第
i
件
物
品
的
体
积
,
将
问
题
转
化
为
完
全
背
包
。
将第i个人写代码产生的BUG数视为第i件物品的体积,将问题转化为完全背包。
将第i个人写代码产生的BUG数视为第i件物品的体积,将问题转化为完全背包。
d
p
[
k
]
[
j
]
表
示
写
k
条
代
码
产
生
不
超
过
j
个
B
U
G
的
方
案
数
。
dp[k][j]表示写k条代码产生不超过j个BUG的方案数。
dp[k][j]表示写k条代码产生不超过j个BUG的方案数。
- d p [ k ] [ j ] = ( d p [ k ] [ j ] + d p [ k − 1 ] [ j − w [ i ] ] ) % m o d dp[k][j] = (dp[k][j]+dp[k-1][j-w[i]])\%mod dp[k][j]=(dp[k][j]+dp[k−1][j−w[i]])%mod
#include <bits\stdc++.h>
using namespace std;
const int N = 501;
int w[N];
int dp[N][N];
int main() {
int n, m, b, mod;
cin >> n >> m >> b >> mod;
for(int i = 0 ; i < n ; i++){
cin >> w[i];
}
for(int i = 0 ; i <= b ; i++){
dp[0][i] = 1;
}
for(int i = 0 ; i < n ; i++){
for(int j = w[i] ; j <= b ; j++){
for(int k = 1 ; k <= m ; k++){
dp[k][j] = (dp[k][j]+dp[k-1][j-w[i]])%mod;
}
}
}
cout << dp[m][b] << endl;
return 0;
}