算法笔记——【递归】整数划分问题
2016-01-15 10:10
267 查看
整数划分问题
将正整数n表示成一系列正整数之和,n=n1+n2+n3+......nk(其中,n1>=n2>=......nk>=1,k>=1),正整数n的这种表示称为正整数n的划分。正整数n的不同划分个数称为正整数n的划分数,记作p(n)。例如:正整数6有11总不同的划分
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;
记q(n,m)为正整数n的所有不同划分中,最大加数n1不大于m的划分个数。可以建立如下递推关系:
前面三个递推式比较好理解,关键是第四个递推式。当n>m>1时,n的划分由两部分组成。以整数q(6,3)为例,q(n,m-1)内容是第5排和第6排内容,不大于2的6的划分;q(n-m,m)内容是第4排,不大于3的(6-3=3)的划分。
程序代码:
将正整数n表示成一系列正整数之和,n=n1+n2+n3+......nk(其中,n1>=n2>=......nk>=1,k>=1),正整数n的这种表示称为正整数n的划分。正整数n的不同划分个数称为正整数n的划分数,记作p(n)。例如:正整数6有11总不同的划分
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;
记q(n,m)为正整数n的所有不同划分中,最大加数n1不大于m的划分个数。可以建立如下递推关系:
前面三个递推式比较好理解,关键是第四个递推式。当n>m>1时,n的划分由两部分组成。以整数q(6,3)为例,q(n,m-1)内容是第5排和第6排内容,不大于2的6的划分;q(n-m,m)内容是第4排,不大于3的(6-3=3)的划分。
程序代码:
import java.util.Scanner; public class Integer { public static int Division(int n, int m, String str) { if ((n <= 0) || (m <= 0)) return 0; if ((n == 1) || (m == 1)) { System.out.print(str); for (int i = 1; i < n; i++) { System.out.print("1+"); } System.out.println("1"); return 1; } if (n == m) { System.out.println(str + n); return 1 + Division(n, m - 1, str); } if (n > m) { int m1 = Division(n - m, m, str + m + "+"); int m2 = Division(n, m - 1, str); return m1 + m2; } return Division(n, n, str); } public static void main(String[] args) { System.out.println("请输入的整数:"); Scanner sc = new Scanner(System.in); int number = sc.nextInt(); int num = Division(number, number, ""); System.out.println("有 " + num + " 种不同的划分"); } }
相关文章推荐
- hibernate进阶--一对多映射配置
- 面试问题
- windows, linus读取properties配置文件
- Java Web学习总结(11)——Session使用示例教程
- Java Web学习总结(11)——Session使用示例教程
- Java基础:多线程之线程池
- 机器学习系列 -- 丈母娘选女婿
- Java Web学习总结(11)——Session使用示例教程
- 搜索关键字 搜索出来的关键字显示红色
- linux下eclipse安装及快捷方式创建
- hibernate没有发出想要的sql。解析原因。
- 简单Collection遍历(List,Set,Map)
- 论App的发展形势
- codeforces 616D Longest k-Good Segment
- PHP基于cookie与session统计网站访问量并输出显示的方法
- MySQL5.7 对半同步复制的改进
- Linux报错
- 要不要来点Swift
- 关于静态与动态编译arm平台程序的比較
- PostgreSQL Monitor pg_activity