多重集组合数

来源:互联网 发布:文学书籍推荐 知乎 编辑:程序博客网 时间:2024/05/22 11:35
/*有n种物品,第i种物品有ai个,不同类的物品可以互相区分但相同种类的无法区分,从这些物品中取出m个话,有多少种取法?,求取出方案模M 的余数。1<=n<=10001<=m<=10001<=ai<=10001<=M<=1000算法时间复杂度:O(nm);*/# include <stdio.h># include <iostream>using namespace std;# define MAX_N 1000+5int n,m;int a[MAX_N];int M;int dp[MAX_N+1][MAX_N+1];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-i-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(cin>>n>>m)    {        for(int i=0;i<n;i++)            cin>>a[i];        cin>>M;        solve();    }    return 0;}

0 0
原创粉丝点击