有n种物品,第i中物品有ai个。不同种类的物品可以互相区分但相同种类的无法区分。从这些物品中取出m个的话,有多少种取法?求出方案数模M的余数。
输入:
3 3 10000
1 2 3
输出:
6 (0+0+3, 0+1+2, 0+2+1, 1+0+2, 1+1+1, 1+2+0)
#include <cstdio>
#include <algorithm>
using namespace std;
int n, m, M;
int a[1000];
int dp[1000][1000];
void solve()
{
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;
}
}
}
printf("%d\n", dp[n][m]);
}
int main()
{
while (scanf("%d%d%d", &n, &m, &M) != EOF){
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
solve();
}
return 0;
}