练习题 No.12 多重集组合数

来源:互联网 发布:淘宝视频空间在哪里 编辑:程序博客网 时间:2024/06/07 09:46

要求

有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;  }
0 0
原创粉丝点击