《挑战程序设计竞赛》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; }