要求
有n种物品,第i种物品有ai个。从这些物品中取出m个的话,有多少种取法?求出方案数模M的余数
限制条件
- 1 <= n<= 1000
- 1 <= m<= 1000
- 1 <= ai<= 1000
- 1 <= M<= 10000
输入格式
第一行输入n m
接下来n行输入ai
接下来输入M
输出格式
输出一行方案数模M
测试输入
3 3
1
2
3
10000
测试输出
6
解题思路
代码
#include <iostream>
using namespace std;
int dp[1001][1001];
int main() {
int n;
cin >> n;
int m;
cin >> m;
int a[1001];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int M;
cin >> M;
for (int i = 0; i <= n; i++) {
dp[i][0] = 1;
}
for (int i = 0; i < n; i++) {
for (int j = 1; j <= m; j++) {
if (j - 1 - a[i] >= 0) {
dp[i + 1][j] = (dp[i + 1][j - 1] + dp[i][j] - dp[i][j - 1 -a[i]] + M) % M;
} else {
dp[i + 1][j] = (dp[i + 1][j - 1] + dp[i][j]) % M;
}
}
}
cout << dp[n][n] << endl;
return 0;
}