整数划分问题(Java递归)
整数划分问题(Java递归)
文章目录

0、 问题描述
整数划分问题
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。正整数n的这种表示称为正整数n的划分。求正整数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
1、递归式
在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个数记作q(n,m)。可以建立q(n,m)的如下递归关系。
q(n,1)=1, n>=1
当最大加数n1不大于1时,任何正整数n只有一种划分形式,
即n=1+1+1+…+1;
q(n,m)=q(n,n), m>=n
最大加数n1实际上不能大于n。因此,q(1,m)=1。
q(n,n)=1+q(n,n-1)
正整数n的划分由n1=n的划分和n1≤n-1的划分组成。
q(n,m)=q(n,m-1)+q(n-m,m),n>m>1
正整数n的最大加数n1不大于m的划分由n1=m的划分和
n1≤m-1 的划分组成。
递归关系如下:

正整数n的划分数p(n)=q(n,n)。
递归图

2、代码
对于一个给定的n(n>=1),计算最大加数不超过m的方案数量
public class Solution {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] arr = new int[2];
for (int i = 0; i < arr.length; i++) {
arr[i] = scanner.nextInt();
}
int x = arr[0];
int y = arr[1];
if (x < 1 || y < 1) {
System.out.println("你输入的参数中有非正整数,请返回后重新输入!");
return;
}
System.out.println("对于你输入的参数,求得的整数划分问题的解的个数为:" + helper(x, y));
}
public static int helper(int a, int b) {
if (a == 1 || b == 1)
return 1;
if (a < b)
return helper(a, a);
if (a == b)
return helper(a, b - 1) + 1;
return helper(a, b - 1) + helper(a - b, b);
}
}
3、参考
- 算法设计与分析(第4版)
结束!
整数划分问题(Java递归)的更多相关文章
- 整数划分问题-解法汇总(暂有DP-递归)
整数划分问题是一个锻炼组合数学,递归以及动态规划很好的例子,虽然问题看似简单,但是其中玄机万千,有人转化成为背包问题,有人用生成函数解,有人以此作为企业面试题目,可见这种问题的认可度还是很高的. 整数 ...
- NYOJ90 整数划分(经典递归和dp)
整数划分 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1. 正 ...
- Java递归列出目录下全部文件
Java递归列出目录下全部文件 /** * 列出指定目录的全部内容 * */ import java.io.*; class hello{ public static void main(String ...
- noi 7219:复杂的整数划分问题
7219:复杂的整数划分问题 查看 提交 统计 提问 总时间限制: 200ms 内存限制: 65536kB 描述 将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>= ...
- hdu1028(整数划分问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1028 整数划分问题 整数划分 --- 一个老生长谈的问题: 描述 整数划分是一个经典的问题.请写一个程 ...
- Java 递归调用 recursive 给一个参数 返回一大堆
需求: 需要组装成对象多层嵌套式的 json字符串; 想到使用 递归来完成这个多层嵌套: 憋了四个小时,终于写出来了; 先看效果: 数据库中的数据: 拼装后的效果: [ EmpVO{ ename='孙 ...
- JAVA 递归实现从n个数中选取m个数的所有组合
这周Java课程有个小作业:Java递归实现从n个数中选取m个数的所有组合 代码如下: //其中 n 取 1,2,3,4,5 五个数, m 取 3 package javaText; public c ...
- JAVA递归、非递归遍历二叉树(转)
原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...
- 慎用Java递归调用
总结:慎用Java递归调用,测试时可以尝试该方法,否则尽量不要使用递归!递归过多调用时,最好改为for或者whlie来代替. 在java语言中,使用递归调用时,如果过多的调用容易造成java.lang ...
- n个整数全排列的递归实现(C++)
全排列是很经常使用的一个小算法,以下是n个整数全排列的递归实现,使用的是C++ #include <iostream> using namespace std; int n = 0; vo ...
随机推荐
- Java设计模式之策略模式(13)
策略模式定义了一系列算法,每个算法封装起来,他们可以相互替换,且算法的变化不会影响到使用算法的客户.可以设计一个抽象类提供辅助. package WHP; public interface ICalc ...
- 记一次mysql5.7保存Emoji表情
1.错误:SQLException; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x90\x96 \ ...
- SSR,SSAO
3D Game Shaders For Beginners Screen Space Reflection (SSR)https://lettier.github.io/3d-game-shaders ...
- centos7 双网卡同网段双网关配置
需求: #1.服务器为双网卡: #2.网卡1为互联网 172.16.137.99/24/254 #3.网卡2为旅游专网 172.16.137.97/24/1 #4.互联网路由器为172.16.137. ...
- ETL常用的三种工具介绍及对比Datastage,Informatica和Kettle
https://blog.csdn.net/qq_34901049/article/details/103676959 大数据量下Informatica与Datastage的处理速度是比较快的,比较稳 ...
- 每日一抄 Go语言死锁、活锁和饥饿概述
DeadLock package main import ( "fmt" "runtime" "sync" "time" ...
- 攻防世界Web篇——unserialize3
知识点: 序列化与反序列化维基百科: 序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后 ...
- Mac下安装lightgbm-image not found
Error Message: : dlopen(/Users/{xxx}/anaconda3/lib/python3.6/site-packages/lightgbm/lib_lightgbm.so, ...
- 【BOOK】正则表达式
正则表达式 1. 开源中国-正则表达式测试工具:https://tool.oschina.net/regex/ 2. 匹配规则 3. match() 从字符串起始位置匹配正则表达式 若从起始位置匹配不 ...
- S32DS中链接文件及启动代码学习
S32DS中链接文件及启动代码学习 一.链接文件 <Linker Files>文件夹中有linker_flash.ld文件和linker_ram.ld文件. Linker File称为链接 ...