整数划分

整数划分问题(分治算法经典) 题目描述: 整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n。 即:n=n1+n2+…+nk; n1>=n2>=n3…>=nk 如整数的6划分为: 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共11种。 补充:正整数的这种操作称为正整数的划分,正整数的不同 阅读详情

整数划分问题相信很多人都做过,题意是这样的:

将正整数n表示成一系列正整数之和,

n=n1+n2+,,,,,+nk(其中n1>=n2>=......>=nk>=1,k>1)

例如:正整数6有如下11种不同的划分,

6=1+1+1+1+1+1
6=1+1+1+1+2
6=1+1+1+3
6=1+1+2+2
6=1+1+4
6=1+2+3
6=1+5
6=2+2+2
6=2+4
6=3+3
6=6

这道题网上搜一大把解题方法,什么回溯法,动态规划等等都可以解出来,昨晚突然想到一个新的解题思路(可能网上已经有人发表过了,不过确实是自己突然发现的,如有雷同,纯属巧合O(∩_∩)O~):

这道题的麻烦之处在于解题过程很容易产生重复的情况,不过只要按照下面的做法就不会出现重复的现象,

当对正整数N划分,有如下划分情况:

N=1+1+........+1

N=1+1+......+2

......

N=1+(N-1)

N=N

接下来如果对N+1(这里用M代替N+1)进行划分时,则在N划分的所有情况前面都加1即


M=1+1+1+........+1

M=1+1+1+......+2

.......

M=1+N


加完之后对每一个新的表达式做如下操作:

步骤1.当表达式的个数小于等于2个时(如:3=1+2表达式的个数为2个),该表达式不作处理,判断下一个表达式,否则执行步骤2

步骤2.当表达式的个数大于2个时,对表达式的前两个数字求和(如:5=1+2+3,则前两个数即为1和2,),如果和小于等于第三个数字时,则构造新的表达式,即将当前表达式的前两个数字合并,其他的保持一致:

如原来的表达式为:M=x1+x2+x3+....xn

则新的表达式为:M=(x1+x2) + x2+x3...+n

如果和大于第三个数字,如:7=2+2+3,前两个数字的和为4,大于第三个数字。则不作处理,跳到步骤1,判断下一个表达式


当全部的表达式(只包括前一个数字的表达式前面加1的那些表达式,不包括这个过程生成的新表达式)都执行完以上步骤之后,最终结果就只差一个了,即本身等于本身的情况,再加上该种情况即可


说的很不清楚,来点实际的吧:

如5的划分情况为:

5=1+1+1+1+1
5=1+1+1+2
5=1+1+3
5=1+2+2
5=1+4
5=2+3
5=5

现在求6的划分,则首先第一步,在5的每个表达式的前面都加1,则得到:

6=1+1+1+1+1+1
6=1+1+1+1+2
6=1+1+1+3
6=1+1+2+2
6=1+1+4
6=1+2+3
6=1+5

接着第二步,按顺序对每个表达式执行之前说的步骤1和步骤2。

1.对于表达式:6=1+1+1+1+1+1,满足步骤1,执行步骤2,因为前两个数相加1+1=2大于第三个数1,所以不作处理,继续判断表达式2

2.对于表达式:  6=1+1+1+1+2,6=1+1+1+3 同样不作处理,继续下一个表达式

3.对于表达式:  6=1+1+2+2,前两个求和:1+1=2等于第三个数,所以满足条件,生成新的有效表达式:6=2+2+2,继续下一个表达式

4.对于表达式:  6=1+1+4 , 6=1+2+3,同理,可以生成新的表达式:6=2+4,6=3+3

5.对于表达式:  6=1+5 不满足步骤1中的条件

6.全部表达式遍历完毕,结束,加上自身等于自身的情况,即:6=6

最终的结果就为:

6=1+1+1+1+1+1
6=1+1+1+1+2
6=1+1+1+3
6=1+1+2+2
6=1+1+4
6=1+2+3
6=1+5
6=2+2+2
6=2+4
6=3+3

6=6

终于写完了,其实思路很简单,但是要说清楚可真麻烦,根据这种思路,代码就可以写了,不过代码也不是很好写的,我这里用了最简单明了的代码完成以上功能,代码写的很不上档次,空间复杂度太高,有时间再优化,欢迎大牛拍砖!

import java.util.ArrayList;
import java.util.List;

public class IntegerSplit {
	private List<int[]> result = new ArrayList<int[]>();
	public void split(int m) {
		//初始化

		result.add(new int[]{1,1});
		result.add(new int[]{2});
		if (m == 1) {
			System.out.println("1=1");
			System.out.println("一共有:1种");
			return ;
		} else {
			for (int i = 3; i <= m; i++) {
				int size=result.size();
				for(int j=0;j<size;j++){
					int[] ca=result.get(j);
					int[] newca=new int[ca.length+1];			
					newca[0]=1;
					System.arraycopy(ca, 0, newca, 1, ca.length);
					ca=null;
					ca=newca;
					result.set(j, ca);
					int[] cs=merger(ca);
					if(cs!=null){
						result.add(cs.clone());
					}
				}
				result.add(new int[]{i});
				
			}
		}
		//打印结果
		for(int[] ca:result){
			System.out.print(m+"=");
			for(int p=0;p<ca.length-1;p++){
				System.out.print(ca[p]+"+");
			}
			System.out.print(ca[ca.length-1]);
			System.out.println();
		}
		System.out.println("一共有:"+result.size()+"种");
		
	}
	//合并
	public int[] merger(int[] ca) {
		if (ca.length <= 2)
			return null;
		if (ca[0] + ca[1] <= ca[2]) {
			int[] rca = new int[ca.length - 1];
			rca[0] = ca[0] + ca[1] ;
			System.arraycopy(ca, 2, rca, 1, ca.length - 2);
			return rca;
		}
		return null;
	}
	public static void main(String[] args) {
		new IntegerSplit().split(10);
	}
}

输出:

10=1+1+1+1+1+1+1+1+1+1
10=1+1+1+1+1+1+1+1+2
10=1+1+1+1+1+1+1+3
10=1+1+1+1+1+1+2+2
10=1+1+1+1+1+1+4
10=1+1+1+1+1+2+3
10=1+1+1+1+1+5
10=1+1+1+1+2+2+2
10=1+1+1+1+2+4
10=1+1+1+1+3+3
10=1+1+1+1+6
10=1+1+1+2+2+3
10=1+1+1+2+5
10=1+1+1+3+4
10=1+1+1+7
10=1+1+2+2+2+2
10=1+1+2+2+4
10=1+1+2+3+3
10=1+1+2+6
10=1+1+3+5
10=1+1+4+4
10=1+1+8
10=1+2+2+2+3
10=1+2+2+5
10=1+2+3+4
10=1+2+7
10=1+3+3+3
10=1+3+6
10=1+4+5
10=1+9
10=2+2+2+2+2
10=2+2+2+4
10=2+2+3+3
10=2+2+6
10=2+3+5
10=2+4+4
10=2+8
10=3+3+4
10=3+7
10=4+6
10=5+5
10=10
一共有:42种

另外加多一段只求划分总数,不求过程的代码:

public class ZSHF {
	public static int q(int n,int m){
		if(n<1||m<1)return 0;
		if(n==1||m==1)return 1;
		if(n<m)return q(n,n);
		if(n==m)return q(n,m-1)+1;
		return q(n,m-1)+q(n-m,m);
	}
	public static void main(String[] args) {
		int number=10;
		int result=q(number,number);
		System.out.println("对整数"+number+"的划分一共有:"+result+"种");
	
	}
}

输出结果:

对整数10的划分一共有:42种




整数划分算法详解及代码实现 整数划分,这个看似简单的数学问题,实质上蕴含着深刻的数学理论与应用价值。它描述的是将一个正整数拆分成多个正整数和的过程,其中,被划分的整数及其各部分均不受顺序的限制。例如,5可以划分为1+1+1+1+1、1+1+1+2、1+1+3、1+4、2+3、5这六种不同的形式。整数划分问题的历史可以追溯到欧拉时代,他在研究数论时发现了划分函数,并以此为基础,构建了现代数论的一个重要分支。直到今天,整数划分仍是研究数论性质的重要工具,尤其在研究整数的加法性质方面有着举足轻重的作用。 阅读详情

相关推荐

整数划分问题

整数划分问题

整数拆分问题的四种解法

整数划分问题是算法中的一个经典命题之一 所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+m3+....+mi;(其中mi为正整数,并且1&lt;=mi&lt;=n),则{m1,m2,m3,....,mi}为n的一个划分。 如果{m1,m2,m3,....,mi}中的最大值不超过m,即max{m1,m2,m3,....,mi} &lt;= m,则称它属于n的一个m划分。这...

NEWPLAN的专栏 13万+

AIOps探索 | 如何用大模型构建高效运维知识及智能问答平台(1)

好久没有分享AIOps相关干货了,最近大模型这么火,而且我们有客户已经基于大模型构建了知识及智能问答平台,需要在运维领域结合使用场景进行应用。为此,楼主从头到尾声梳理了一遍大模型在运维领域构建知识及智能问答平台的应用场景、技术实现,总结出来供大家一同探索,希望对大家理解和运用大模型有一定帮助~

智能运维及数据中台探索 2810

整数划分问题(详解 n > m 情况)

整数划分问题(详解 n > m 情况)

若尘的博客 4561

AI算力网络与通信领域流量分析:优化策略探讨_副本

今天的AI就像一个"超级吃货",每天要"吃"掉海量数据、“消耗"巨量算力——训练一个千亿参数的大模型,可能需要上万块GPU同时工作数周,其间产生的数据传输量足以填满数百万个1TB硬盘。这些GPU和计算节点通过网络连接形成"AI算力网络”,而数据在节点间的流动就是"通信流量"。如果把算力比作AI的"肌肉",那流量就是"血液"——血液不通畅,肌肉再强也使不上劲。

AI天才研究院 1198

设计一个订单管理系统(OMS)系统100问?

一个完善的订单管理系统不仅仅是简单地记录和处理订单信息,更需要考虑到订单的全生命周期管理,包括订单的创建、支付、配送、售后等环节。这100个问题围绕订单管理系统(OMS)的各个方面展开,涵盖了系统的功能、架构、安全性、异常处理、订单处理流程、支付、库存管理、客户管理、报表与分析等多个方面。通过这些问题,可以全面考虑订单管理系统在设计与实现过程中需要考虑的各种因素,从而确保系统能够满足业务需求、具有良好的性能和稳定性,同时易于扩展、维护和管理。

nbsaas-boot基于Request-Response的企业级快速开发框架 1384

整数划分算法

整数划分问题 问题阐述 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1。 正整数n的这种表示称为正整数n的划分。 输入:一个正整数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 问题分析 n的划分结果计算 采用分治思想n本身作为一种划分即为一种,加上剩下种类的个数

realstarstarli的博客 5079

网络抓包实战:如何捕获与解析802.1Q VLAN标签报文

在网络通信中,数据包是信息传输的基本单元,而VLAN(虚拟局域网)技术通过在数据链路层插入802.1Q标签,实现了网络流量的逻辑隔离与高效管理。其核心原理是在标准以太网帧头中嵌入4字节的VLAN标识,使交换机能够根据VID(VLAN ID)进行精准转发。掌握VLAN报文的捕获与解析技术,对于网络故障排查、安全审计和性能优化具有重要价值,尤其在需要验证网络隔离策略或诊断Trunk链路异常时。本文聚焦于使用Wireshark工具,结合端口镜像等实操方法,详细演示如何抓取并解读携带802.1Q标签的原始报文,帮助

weixin_33417488的博客 383

递归实现整数划分

递归思想 递归是算法设计中的一种基本而重要的算法。递归方法通过函数调用自身将问题转化为本质相同但规模较小的子问题,是分治策略的具体体现。 不多废话,直接上故事 从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事,老和尚讲:从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事,老和尚讲:…… 上面的故事本身是递归的,用递归算法描述: void bonze-tell-story () { ...

xml_lmx的博客 1万+

MPU6050运动中断唤醒STM32低功耗休眠模式实战

本文详细介绍了如何使用MPU6050运动中断唤醒STM32低功耗休眠模式的实战方案。通过配置MPU6050的运动检测中断作为STM32的唤醒源,实现设备在静止时进入低功耗Stop模式,运动时快速唤醒,大幅延长电池续航。涵盖硬件连接、软件配置、参数调试等关键步骤,并提供实际应用案例和优化建议。

rgv23456789的博客 703

C#实战大华智能安防系统:从SDK封装到视频流与智能报警的全链路落地

本文将介绍C#集成大华SDK开发安防系统的实战经验,重点解决多路视频预览卡顿和报警延迟问题。文章通过三层架构设计(SDK封装层、业务服务层、应用层)实现解耦,详细分析线程安全封装、高效解码显示和智能事件联动等核心技术。针对16路摄像头同时预览时CPU占用率过高的问题,提出使用子码流拉流与异步解码的优化方案,并总结8个常见开发陷阱的解决方案。文中还提供了大华智能安防系统的完整架构图,展示从设备层到应用层的交互流程,特别强调业务服务层中视频流服务和智能报警服务的核心功能设计。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 432

整数划分总结

整数划分问题: 笼统上说就是将一根整数划分成若干个整数之和的方案数。整数划分很多不同的问法,也有隐晦的问法。比如n个苹果放到m个盘子里,比如n个砖块堆成m个层阶梯。关于整数划分,大概有以下这么多扩展的问题: 1,整数n划分成若干整数之和的方案数; 2,整数n划分成k个整数之和的方案数; 3,整数n划分成最大数不超过k的若干整数之和的方案数; 4,整数n划分成最小数不低于k的若干整数之和的方

Dacc123的博客 2043

深入浅出:使用Python爬取链家二手房数据

在数据驱动的时代,房地产数据作为社会经济的重要指标,一直是数据分析师、投资者和研究人员关注的焦点。链家作为国内领先的房产中介平台,其二手房数据具有较高的真实性和时效性。然而,官方API的访问限制和数据获取的门槛,让很多初学者望而却步。本文将带你从零开始,使用Python编写一个符合robots.txt规范的链家二手房爬虫,获取标题、户型、价格等信息。文章不仅会提供完整代码,还会深入讲解反爬策略、请求头伪装、数据解析、异常处理等实战技术。目录前言:为什么要写这篇博客?一、爬虫前的准备:法律与道德。

2201_76125261的博客 90

【模板题】动态规划:简单的整数划分问题,复杂的整数划分问题——01背包变形

4117:简单的整数划分问题——01背包变形思路:dp[i][j]表示从1~j中选取数字能组成 i 的种类数初始化:dp[1][i]=1;//1+...+1=i       dp[i][1]=1;//仅选1=1状态转移:1)i==j时,则dp[i][j]=dp[i][j-1]+1;//仅选取j组成和=i,一种情况          2)j&gt;i,则第i+1,i+2,...,j 这些数没有用  ...

Always_ease的博客 1358

YOLO26 改进 - 注意力机制 | Mask Attention掩码注意力,可学习掩码矩阵破解低分辨率特征提取难题 | 2025 预印

本文提出了用于低分辨率图像分割的MaskAttn - UNet框架,并将其核心的掩码注意力机制集成到YOLO26中。传统U - Net类模型难以捕捉全局关联,Transformer类模型计算量大,而掩码注意力机制通过可学习的掩码,让模型选择性关注重要区域,融合了卷积的局部效率和注意力的全局视野。其工作流程包括特征适配、掩码生成、定向注意力计算和特征融合。我们将掩码注意力机制代码集成到YOLO26中。

魔改工程师的博客 835

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

整数划分问题详解

整数划分问题题目描述思路分析代码实现 大家好,这是我的第一篇博客。先做一下自我介绍吧,我是河北大学的一名软件工程本科生,目前大二在读。我对编程没什么基础,就是想通过写博客的方式让自己记录一些日常学习,并和他人进行思路讨论,达到能快速提升自己编程能力的目的。欢迎大家来此讨论,小白们可以互相支持鼓励啊! 题目描述 将正整数n表示成一系列正整数之和 正整数n的不同的划分个数成为正整数n的划分数,记为p(...

CAI_Ambassador的博客 2398

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 一组数中最长连续递增子序列个数
下一篇: 最短路径问题
KeepThinking_
博客等级 码龄15年 50粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值