多重集组合数问题
有n个物品,第i件物品有ai个。不同种类的物品可以相互区分,同一种类的物品无法区分。这些物品中取出m个的话,有多少种取法?求出方案数模M的余数。
#include <iostream>
using namespace std;
int dp[1000][1000];
int main(){
int n,m,a[1000],M;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
}
cin>>M;
dp[1][0]=1;dp[1][1]=1;
dp[0][1]=0;
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][m];
return 0;
}
//dp[i+1][j]=dp[i+1][j-1]+dp[i][j]-dp[i][j-1-a[i]](多加的现在减去) 转移方程
/*
3
3
1 2 3
1000
*/