首页 > 代码库 > 划分数
划分数
问题描述
有n个无区别的物品,将它们划分成不超过m组,求出划分方法数模M的余数
限制条件
1 <= m <= n <= 1000
2 <= m <= 10000
声明 将n 分成m 堆 这样称作 n的m划分
定义dp[i][j] i 的 j划分的个数
递推过程
考虑n的m划分ai(a0 +a1 + ... + am = an) > 0
那么{ai-1}就对应着n-m 的 m 划分
如果有ai = 0 那么就对应了n 的 m-1划分
所以dp[i][j] = dp[i-j][j] + dp[i][j-1]
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 6 int n, m, M; 7 int dp[1007][1007]; 8 int main() 9 { 10 freopen("in.txt", "r", stdin); 11 scanf("%d%d%d", &n, &m, &M);//n划分为不超过 m堆 12 memset(dp, 0, sizeof(dp)); 13 dp[0][0] = 1;//0分到0堆 个数为1 14 //dp[i][j] --->>> j的i划分 15 for (int i = 1; i <= m; i++) 16 { 17 for (int j = 0; j <= n; j++) 18 { 19 if (j - i >= 0) dp[i][j] = dp[i-1][j] + dp[i][j-i]; 20 else dp[i][j] = dp[i-1][j]; 21 } 22 } 23 cout << dp[m][n] << endl; 24 return 0; 25 }
划分数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。