整数划分问题
2016-04-01 21:36
232 查看
将正整数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));
}
}
结果显示:
正整数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));
}
}
结果显示:
相关文章推荐
- 第5周项目1 三角形3
- Corona SDK 游戏开发引擎介绍
- 20145216史婧瑶《Java程序设计》第5周学习总结
- Splay_Tree 模板(区间修改,旋转操作)
- 反向代理分离资源服务器分析
- format参数问题
- leetcode-Excel Sheet Column Title
- 大数阶乘(10000级别) 51Nod 1057
- 使用TimerTask进行调度
- 人工蜂群算法
- linux c struct tm宏定义时有时报dereferencing pointer to incomplete type错误,可以将包含头文件改为#include <sys/timeb.h>
- Tricks(十九)—— 获得 list of lists 每一列的最大最小值
- springSecurity分离资源服务器分析
- Java集合ArrayList的应用
- DFS-素数环
- 单向链表的实现
- 20145107 《Java程序设计》第五周学习总结
- CSS---基础外部样式表
- hdu 2082 找单词
- AVI文件的读取并显示