【代码+详解】算法题 :简单的整数划分问题

❗❗❗必看:
下列题我全部都使用 Java 语言写的,并且均可以提交成功,获得Accepted 结果的. 如果代码和详解看了之后,对答案有任何疑问,都可以在评论区提出来,我都会一个一个回答.

❗❗❗感谢大家的支持,如果喜欢我的博客,关注 点赞 收藏 评论一波,非常感谢!!!

题目:简单的整数划分问题

将正整数n 表示成一系列正整数之和,n=n(1)+n(2)+…+n(k), 其中n(1)>=n(2)>=…>=n(k)>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。

Input

标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。

Output

对于每组测试数据,输出N的划分数。

样例测试

输入

5

输出

7


代码

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	while(scanner.hasNextInt()) {
		System.out.println(fun(scanner.nextInt()));
	}
	scanner.close();
}



private static int partitionCount(int n,int m) {
	if(m==1) return 1;
	if(n==m) return partitionCount(n,m-1)+1;
	if(n>m) return partitionCount(n-m,m)+partitionCount(n,m-1);
	if(n<m) return partitionCount(n,n);
	return -1;

}
private static int fun(int n) {
	return partitionCount(n,n);
	
}
}

图解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

详解

初步思路

利用递归的方式,将问题拆分成更小的子问题来求解。主要是通过拆分的方式,将整数n逐步减小,并考虑不同的组合情况。

具体步骤

  1. 定义递归函数:

    • partitionCount(n, m) 用于计算整数 n 的划分数,其中最大加数不超过 m。
  2. 递归终止条件:

    • 当 m 为1时,只能有一种划分方式(即全部由1组成),返回1。
    • 当 n 等于 m 时,可以有两种情况:
      • 只包含一个 n (即 n 本身),这种情况下划分数为1。
      • 不包含 n,剩下的情况由 partitionCount(n, m-1) 给出。
  3. 递归调用:

    • 当 n > m 时,划分数可以通过两部分相加得到:
      • 包含 m 的划分数: partitionCount(n-m, m)
      • 不包含 m 的划分数: partitionCount(n, m-1)
    • 当 n < m 时,最大加数就变为 n 本身,即调用 partitionCount(n, n)。
  4. 初始调用:

    • 通过 fun(n) 方法调用 partitionCount(n, n) 来计算 n 的划分数。

总结方法

这个算法利用了递归的思想,把复杂问题化简为规模较小的子问题来解决。每次递归调用通过考虑当前加数是否包含 m 来分解问题,最终的划分数是各子问题结果的累加。这种方式不仅有效解决了整数划分问题,也展示了动态规划思想在优化递归中的应用。

这个方法的核心在于:通过定义递归函数并合理设定递归终止条件,逐步拆解问题,将其转化为更小的子问题来解决。这样不仅提高了代码的可读性和维护性,也为理解和解决其他类似问题提供了思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值