您的位置:首页 > 其它

划分数

2016-07-31 18:23 204 查看
//划分问题:将n个无区别的问题,划分成不超过m组,求划分方法数模M的余数
//n的m划分数,记为dp[m]

//记每一组物品的个数为a[i],1<=i<=m,显然a[i]>=0
//如果对于任意1<=i<=m,有a[i]>0,则{a[i]-1}就对应n-m的m划分数,即为dp[m][n-m]
//如果存在一个a[i]等于0,就对应着n的m-1划分数,即为dp[m-1]

//所以dp[m]
=dp[m][n-m]+dp[m-1]

//时间复杂度为O(nm)
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1000+5;
int dp[maxn][maxn];
int M;
int n,m;
void solve()
{
dp[0][0]=1;
for(int i=1;i<=m;i++){
for(int j=0;j<=n;j++){
if(j>=i){
dp[i][j]=(dp[i][j-i]+dp[i-1][j])%M;
}
else{
dp[i][j]=dp[i-1][j]%M;
}
}
}
printf("%d\n",dp[m]
);
}
int main()
{
scanf("%d%d%d",&n,&m,&M);
solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息