您的位置:首页 > 其它

算法笔记——【递归】整数划分问题

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)的划分。

程序代码:

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 + " 种不同的划分");
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: