整数划分问题

来源:互联网 发布:2007办公软件下载 编辑:程序博客网 时间:2024/05/16 14:31

将正整数n表示成一系列正整数之和,n=n1+n2+n3+...+nk,其中n1>=n2>=...>=nk>=1,k>=1。

正整数n的这种表示称为正整数n的划分。正整数n的不同的划分个数称为正整数n的划分树,记作p(n)。

算法思路:在正整数n的所有不同的划分中,将最大加数n1不大于m的划分个数记作q(n,m)。

递归式为:

q(n,m)=1                                       n=1,m=1   

q(n,m)=q(n,n)                               n<m           

q(n,m)=1+q(n,n-1)                       n=m           

q(n,m)=q(n,m-1)+q(n-m,m)        n>m>1      


算法如下:

package cn.aaa;
import java.util.Scanner;

//整数划分问题
public class NumDivide {
//整数划分方法
public static int q(int n,int m){ //n为输入的数,m为能分解的数
if(n<0 || m<0)
return 0;
if(n==1 || m==1)
return 1;
else if(n==m && m>1)
return 1+q(n,m-1);
else if(n==m)
return q(n,n);
return q(n,m-1)+q(n-m,m);
}

public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int num = s.nextInt();
System.out.println("正整数num的划分个数为:"+q(num,num));
}
}


结果显示:




0 0