《挑战程序设计竞赛》2.3.3
:有n个无区别的物品,将他们划分成不超过m组,求出划分方法数模M的余数
称做n的m划分,dp定义如下:
dp[ i ] [ j ] =j的i划分的总数;
考虑n的m划分ai (a1+a2+a3+...+am ==n) ,对于每个i都有ai>0,,So..{ai-1} 也就对应了n-m的m划分 ,..另,如果存在ai==0,那么这就对应了n的m-1划分,,
所以,,有以下递推关系
dp [ i ][ j ]=dp[ i ][ j-1 ]+dp[ i-1 ][ j ];
复杂度为O(nm)
#include <iostream>
#include<cstdio>
using namespace std;
int dp[100][100];
int main()
{
freopen("1.txt","r",stdin);
int n,m,M;
while(cin>>n>>m>>M)
{
dp[0][0]=1;
for(int i=1; i<=m; i++)
for(int j=0; j<=n; j++)
{
if(j-i>=0)
dp[i][j]=(dp[i-1][j]+dp[i][j-i])%M;
else
dp[i][j]=dp[i-1][j];
}
cout<<dp[m][n]<<endl;
}
return 0;
}