划分数

有n个无区别的物品,将它们划分成不超过m组,求出划分方法数模M的余数

1<=m<=n<=1000   2<=M<=10000

这样的划分称作n的m划分

dp[i][j]:j的i划分的总数

考虑n的m划分a1,a2...am 如果对于每个i都有ai>0,那么{ai-1}就对应了n-m的m划分。如果存在ai=0,就对应了n的m-1划分

所以dp[i][j]=dp[i][j-i]+dp[i-1][j]

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<memory.h>
 4 #define INF 10000000
 5 using namespace std;
 6 const int max_n=1001;
 7 int n,m,M;
 8 int main()
 9 {
10     cin>>n>>m>>M;
11     int dp[m+1][n+1];
12     memset(dp,0,sizeof(dp));
13     dp[0][0]=1;
14     for(int i=1;i<=m;i++)
15     {
16         for(int j=0;j<=n;j++)
17         {
18             if(j-i>=0)
19             {
20                 dp[i][j]=(dp[i][j-i]+dp[i-1][j])%M;
21             }
22             else
23             {
24                 dp[i][j]=dp[i-1][j];
25             }
26         }
27     }
28     cout<<dp[m][n]<<endl;
29     return 0;
30 }
View Code
原文地址:https://www.cnblogs.com/wangkaipeng/p/6430483.html