【数论】整数的划分问题
来源:互联网 发布:晚晚的淘宝店铺叫什么 编辑:程序博客网 时间:2024/05/17 22:35
整数的划分问题是一个很经典的问题,它的变形也非常的多,总结了一下,大概有以下几种变形:
1) 将 N 划分为若干个正整数的和的划分数
2) 将 N 划分为若干个不同的正整数的和的划分数
3) 将 N 划分为不超过K 个正整数的和的划分数
4) 将 N 划分为不超过K 个不同正整数的和的划分数
5) 将 N 划分为最大数不超过K 的正整数的和的划分数
6) 将 N 划分为若干个连续正整数的和的划分数
ohoh,怎么这么多@@
变形(1): 将 N 划分为若干个正整数的和的划分数。比如 6,可以这样划分:
6
5 + 1
4 + 2, 4 + 1 + 1
3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1
2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1 + 1
所以答案应该是 11.
分析:
根据n和m的关系,考虑以下几种情况:
(1)当n=1时,不论m的值为多少(m>0),只有一种划分即{1};
(2)当m=1时,不论n的值为多少,只有一种划分即n个1,{1,1,1,...,1};
(3)当n=m时,根据划分中是否包含n,可以分为两种情况:
(a)划分中包含n的情况,只有一个即{n};
(b)划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有(n-1)划分。
因此 f(n,n) =1 + f(n,n-1);
(4)当n<m时,由于划分中不可能出现负数,因此就相当于f(n,n);
(5)但n>m时,根据划分中是否包含最大值m,可以分为两种情况:
(a)划分中包含m的情况,即{m, {x1,x2,...xi}}, 其中{x1,x2,... xi} 的和为n-m,可能再次出现m,因此是(n-m)的m划分,
因此这种划分个数为f(n-m, m);
(b)划分中不包含m的情况,则划分中所有值都比m小,即n的(m-1)划分,个数为f(n,m-1);
因此 f(n, m) = f(n-m, m)+f(n,m-1);
因此,设dp[n][m] 表示将 n 划分为 最大数不超过 m 的划分个数,有
dp[n][m] = 1 ( m = 1)
dp[n][m] = dp[n][m-1] + 1 ( m = n)
dp[n][m] = dp[n][n] ( m > n)
dp[n][m] = dp[n][m-1] + dp[n-m][m] ( m < n)
Code:
变形(2):将 N 划分为若干个不同正整数的和的划分数 TOJ.3511 Staircases
依然是DP,转移方程为 a[k][n]=a[k+1][n]+a[k+1][n-k];其中a[k][n]表示将n划分为不小于k种不同的数的划分法。
初始化为 a[n][n]=1 ; a[k][n]=0 (k>n).
Code:
变形(3):将 N 划分为不超过K 个正整数的和的划分数
解法:dp[i][j] 表示将 i 划分为 j 份的划分数,则转换为求 sigma( dp[N][ i ] ) (i <= K);
dp[i][j] 的转移方程为 dp[i-1][j-1] + dp[i-j][j];
详细见http://wurong81.spaces.live.com/blog/cns!5EB4A630986C6ECC!254.entry
Code:
变形(4):将 N 划分为不超过K 个不同正整数的和的划分数
解法:即为变形2的方程意义。a[k][n] 表示将 N 划分为不超过K份不同的数的和的划分数
变形(5):
变形(6): 这个最简单了。N 可以写为连续K(K >= 2)个正整数的和,则K <= sqrt(2*N);
令 i 从 K 到 2 循环,如果 i 为奇数 且 N %i == 0,则可分解为 i 个数,第一个数为 N/i - i/2;
如果 i 为偶数 且 N %i == i/2,则可分解为i 个数,第一个数为 (N-1)/i - i/2 + 1;
- 【数论】整数的划分问题
- 【数论】整数的划分问题
- 整数划分的问题
- 整数的划分问题
- 整数的划分问题
- 整数的划分问题
- 简单的整数划分问题
- 复杂的整数划分问题
- 简单的整数划分问题
- 简单的整数划分问题
- 整数划分问题:输出一个整数的所有划分并统计总划分数
- 整数划分的问题(c)
- 整数划分问题的解决-POJ1664
- openjudge 简单的整数划分问题
- 动态规划解决整数划分的问题
- Openjudge7219 复杂的整数划分问题(dp)
- OpenJudge_P7215 简单的整数划分问题(DP)
- OpenJudge_P7219 复杂的整数划分问题(DP)
- 深入浅出ShellExecute
- 利用oracle快照实现两台数据库服务器表同步
- 软件需求最佳实践-SERU过程框架原理与应用(徐锋 电子工业出版社)
- mysql C编程-utf8编码,汉字和blob类型
- Decorator パターン
- 【数论】整数的划分问题
- 近代易学名师尚秉和
- Extjs中RadioGroup的获取值和赋值
- Web parts 不显示verb按钮的问题
- symbian对话框(2)
- PowerPoint 幻灯片 PPT 进度条 制作
- JAVA学习笔记 -- Vector, ArrayList, Array
- Log4net(1.2.10.0)配置
- 架构设计之4+1视图