数组分为两部分,使得其和相差最小

背包问题变种:将数组分成两部分使得两部分的和的差最小 题目: 将一个数组分成两部分,不要求两部分所包含的元素个数相等,要求使得这两个部分的和的差值最小。比如对于数组{1,0,1,7,2,4},可以分成{1,0,1,2,4}和{7},使得这两部分的差值最小。 思路:差最小就是说两部分的和最接近,而且和所有数的和SUM的一半也是最接近的。假设用sum1表示第一部分的和,sum2表示第二部分的和,SUM表示所有数的和,那么sum1+sum2=SUM。... 阅读详情

【问题】将数组分为两部分,使得两部分的和最接近,返回两部分的差值。例如:

int[] array={1,0,1,7,2,4},分为两部分为{1,0,1,2,4},{7},差值为1。


参考1:《编程之美》第2.18节,不过问题有所不同,2.18节要求长度为2n的数组分为两个长度为n的数组,使得两部分和最接近。

参考2:http://www.tuicool.com/articles/ZF73Af


【思路】动态规划的解法。求得array的和sum,问题转化为:在array中选取若干个元素,使得这些元素的和<=sum/2,且是最接近sum/2的元素集合。

开一个数组:int[][]f=new int[length+1][sum/2+1]

状态方程:f[i][j]=Max(f[i-1][j-array[i]]+array[i],f[i-1][j])

解释:f[i][j]表示array中i个元素的和<=j,且是最接近j的元素集合。f[i-1][j-array[i]]表示array中i-1个元素的和最接近j-array[i],所以f[i][j]应该是[i-1][j-array[i]]+array[i]和f[i-1][j]中最大的那个。有点像0-1背包问题。


例题:网易2017春招题:双核处理

https://www.nowcoder.com/test/question/9ba85699e2824bc29166c92561da77fa?pid=4575457&tid=9777401

思路:把数组分为两部分,使得两部分的和相差最小,再求这两部分和的最大值即为题解。

package test;

import java.util.Scanner;
/** 
* @author xiaohao 	
* @date 创建时间:Aug 11, 2017 4:37:52 PM 
* @version 1.0   
*/
public class twoSubArray_MinDiff {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner (System.in);
		int n=sc.nextInt();
		int a[]=new int [n];
		for(int i=0;i<n;i++)
		{
			a[i]=sc.nextInt()/1024;
		}
		System.out.println(getTwoSubArrayMinDiff(a)*1024);
	}

	public static int getTwoSubArrayMinDiff(int[] arr) {
		// TODO Auto-generated method stub
		int sum=0;
		for(int i=0;i<arr.length;i++)
		{
			sum+=arr[i];
		}
		
		int temp[][]=new int[arr.length+1][sum/2+1];//注意开辟数组的行数列数要多1,是从第1行第1列开始保存数据
		for(int i=0;i<arr.length;i++)
			for(int capacity=1;capacity<=sum/2;capacity++)
			{
				temp[i+1][capacity]=temp[i][capacity];
				if(arr[i]<=capacity && temp[i][capacity-arr[i]] +arr[i]>temp[i][capacity]){
					temp[i+1][capacity]=temp[i][capacity-arr[i]]+arr[i];//可以放,且值比之前要大,则更新
				}
			}
		return Math.max(temp[arr.length][sum/2], sum-temp[arr.length][sum/2]);
	}

}


算法二十二:数组和之间差最小 有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 例如:  var a=[100,99,98,1,2, 3]; var b=[1, 2, 3, 4,5,40]; 分析:要是序列的和之差最小,考虑将两个序列组合成一个序列1,对序列求和sum,选取一个数组,使得这个数组的和最接近sum/2,对合成... 阅读详情

相关推荐

数组分割问题(另一种说法是交换两个数组元素使两个数组和的差最小)

<br />一、数组分割问题:(原帖见http://www.cppblog.com/baby-fly/archive/2009/09/24/92392.html)<br />题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。<br />假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合。显然:<br />S(k, 1) = {A[i] | 1<= i <=

cloudary的专栏 4517

交大机试题目:分割一个数组为两部分,使得其两部分和的差值最小

题目链接 描述 一个数组中有若干正整数,将此数组划分为两个子数组,使得两个子数组各元素之和a,b的差最小,对于非法输入应该输出ERROR。 输入描述: 数组中的元素 输出描述: 降序输出两个子数组的元素和 示例 Input 10 20 30 10 10 10 20 abc 10 10 Output 40 40 ERROR 思路: 也就是求数组中哪些元素的和,能够在小于等于sum/2的条件下最大。于是,看似是01背包的题。 但是,01背包的体积V是有限制的,这里V可以很大!int范围内都可以取到,也就是需

桂圆儿的仓库 1505

把数组中的数分为两组,使得两组的和相差最小的情况下保证两组数据个数的差值最小

给定一个数组,分成两个数组使得两个组的和的差的绝对值最小,并且输出两部分个数差值最小 #include <iostream> #include <cstdio> #include <cstring> //for memset #include <algorithm> //for max...

没得选择丶 4724

将数组分成两部分,使得这两部分的和的差最小

将数组分成两部分,使得这两部分的和的差最小 将一个数组分成两部分,不要求两部分所包含的元素个数相等,要求使得这两个部分的和的差值最小。比如对于数组{1,0,1,7,2,4},可以分成{1,0,1,2,4}和{7},使得这两部分的差值最小。 这个问题可以转化为求数组的一个子集,使得这个子集中的元素的和尽可能接近sum/2,其中sum为数组中所有元素的和。这样转换之后这个问题就很类似0-1背包问题了:在n件物品中找到m件物品,他们的可以装入背包中,且总价值最大不过这里不考虑价值,就考虑使得这些元素的和尽量接近s

weixin_43310882 2755

数组元素最小差值 C++实现

问题描述:给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。 输入格式:输入第一行包含一个整数n。第二行包含n个正整数,相邻整数之间使 用一个空格分隔。 输出格式:输出一个整数,表示答案。 输入: 5 1 5 4 8 20 输出: 1 输入: 5 9 3 6 1 3 输出 0 数据规模和约定:对于所有评测用例,2 ≤ n ≤ 1000,每个给定的整数都是不超过10000...

皮卡丘LIII的博客 3289

csp——最小差值C++100分

大家好,我是yma16,本文分享csp——最小差值C++100分c++语法C++ 是一种广泛使用的高级计算机编程语言,其语法主要包括以下几个方面:基本数据类型:包括 int、float、double、char 等基本数据类型。控制语句:包括 if、else、for、while、do while 等控制语句。数组:可以声明一维和多维数组,可以用数组下标访问数组元素。指针:可以使用指针来访问内存地址以及动态分配内存。函数:可以定义自己的函数,函数可以带参数和返回值。

编程知识分享,主打前端 3万+

把一个数组分为两部分使得其和相差最小——Java实现(详细注释,全面解析)

【代码】把一个数组分为两部分使得其和相差最小——Java实现(详细注释,全面解析)

qq_44182424的博客 887

《寻秦OL》.ani动画逆向解析:二进制结构与Unity重实现

动画文件格式是游戏资源逆向的核心入口,其本质是一组按特定规则组织的二进制数据流。理解魔数识别、字节序、字段对齐与差分编码等底层原理,是解析非标准格式的关键前提。技术价值在于绕过黑盒协议,直接从静态客户端提取可验证的原始语义;典型应用场景包括老游戏复刻、美术资产抢救、引擎跨平台迁移及教学级逆向训练。本文以《寻秦OL》的`.ani`文件为实例,深入剖析其C风格结构布局、GB2312中文命名、16位定点数旋转表示及帧主序差分存储机制,并基于C#在Unity中完成从字节流到AnimationClip的端到端重建,覆

weixin_30368981的博客 640

将数组分成两部分使得两部分的和的差最小

题目有点拗口,举个例子,有1,2,3一共3个数,将这三个数分成两部分,有3种分法1 | 2,3或者1,2| 3 或者1,3|2,然后计算每部分所有数的和, 1 | 2,3 -> 和为1,5,和的差是4 1 2| 3 -> 和为3,3,和的差是0 1 3|2 -> 和为4,2,和的差是2 所以按照1,2| 3分得到的和的差最小。 那么任意给定一个数组,如何找出最小值呢? 思路:差

SOULDAK 1万+

从充电管理芯片里‘偷师’:拆解一个PMOS双向开关电路,搞定你的固态继电器需求

本文深入解析了PMOS双向开关电路在固态继电器应用中的设计要点,重点探讨了防电流倒灌和高侧双向开关的实现技巧。通过拆解充电管理芯片中的PMOS背靠背结构,工程师可以构建高效可靠的固态开关方案,适用于智能硬件和电池管理系统。文章还提供了关键参数选择、电路优化建议及实测数据对比,助力解决电源防反接等工程难题。

weixin_33698043的博客 481

基于物联网技术智慧园林绿化养护管理信息平台

近几年来,随着经济不断的发展,城市面积不断的扩大,城市管理中的园林绿化工作也在这种趋势下不断的发生着深刻改变。管养企业是否按制定的管养计划严格执行?绿化事件整改是否及时到位?绿地面积是否在稳步增长?管养的效果如何?如何客观评价管养企业的管养工作?这些都是我们各级管理者需要面对的问题。   智慧园林绿化养护管理信息平台的开发思路以“考核”为核心,整个信息平台体现出“新、快、高、全、享”五个特点。   智慧园林绿化养护管理信息平台的整个开发理念为:依托五大技术手段(全球卫星定位系统技术、地理信...

Cesium的博客QQ2252224326 2459

将一个数组划分为和差值最小的子数组

要求:将数组中的数划分为两组,使得两个子数组的和的差值最小,数组中的数的取值范围为0 如:a[]={2,4,5,6,7},得出的两组数:{2,4,6}和{5,7},abs(sum(a1)-sum(a1))=0;如:{2,5,6,10},abs(sum(2,10)-sum(5,6))=1; 所以:子数组为:{2,10}和{5,6}。 思路:很容易知道如果选取的某个子数组的和currentS

(* ̄︶ ̄) 2万+

逻辑漏洞:水平越权、垂直越权靶场练习

水平越权和垂直越权是组织中常见的管理问题,指的是员工在组织中所拥有的权力和责任超出其职位所应具备的范围。 水平越权是指员工在同一级别的职位上超越了其同事的权力和责任范围,通常表现为某个员工在团队中承担了过多的任务或权力,导致其他同事感到不公平或不满。 垂直越权则是指员工在组织中超越了其职位等级的权力和责任范围,通常表现为员工在没有得到上级批准的情况下做出决策或行动,可能会导致组织内部的混乱和冲突。

qq_68163788的博客 2470

关于数组中最小两数差的学习总结

 zwdnet同学在下面的贴子提到了如下问题:“求助:求一个整数数组的最小子序列之和结果出错是《算法设计与分析基础》一书的一道习题,原题是要求一个整数数组中大小相差最小的两个元素之差(只要求差值),题目给出了穷举的方法,并要求改进。我在网上搜了,有人给出了答案,但是没有代码(见http://fayaa.com/tiku/view/116/),我按其方法用c++试了试,答案和用穷举法做的

qiuzhenguang的专栏 6764

立创开源桌面激光雕刻机DIY全解析:从悬臂结构、Arduino主控到Marlin固件

本文详细解析了基于立创开源平台的桌面激光雕刻机DIY全过程。重点介绍了悬臂式机械结构的设计与优化,阐述了采用Arduino Mega 2560主控与RAMPS 1.4扩展板的经典控制方案,并深入讲解了Marlin固件的关键配置步骤,包括电机步数计算与激光功能启用,为创客和电子爱好者提供了一套完整的从硬件搭建到软件调试的实战指南。

weixin_42510201的博客 383

24年电赛H题 | 想要小车走直线,正在调角度环,但不知道怎么把角度偏航角偏差转化成电机速度输出?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1313

ks+数组两部分之差最小,01背包

//数组分为两部分,使其和相差最小 //01背包,在n件物品中找到m件物品,他们的可以装入背包中,且总价值最大不过这里不考虑价值,就考虑使得这些元素的和尽量接近sum/2。 //如果第i件物品没有包括在其中,则dp[i][j] = dp[i-1][j] //如果第i件物品包括在其中,则dp[i][j] = dp[i-1][j-vec[i] for(int i=1;i<=len;i++){...

小堃哥的专栏 309

2025.06.06【Ribo-seq】|RiboCode:基于Ribo-seq数据的全基因组翻译ORF检测工具详解与实战流程

大家好!今天我们要学习的是RiboCode——一个专为Ribo-seq(核糖体足迹测序)数据设计的高质量翻译ORF(开放阅读框)检测工具。RiboCode能够帮助我们在全基因组范围内精准识别翻译事件,发掘经典CDS之外的uORF、dORF、重叠ORF等新型翻译本,极大拓展了我们对转录本翻译潜能的认知。RiboCode 是由清华大学杨学睿课题组开发的开源软件,支持Linux/Mac平台,采用Python实现。自动化流程:一条命令即可完成注释准备、P-site定位、ORF预测。高灵敏度与特异性。

1856

C++算法之 旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.   我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素。我们还可以注意到最小的元素刚好是这两个子数组的分界线。我们试着

CppPlayer 1201

核心组件大换血:Backbone与Neck魔改篇:YOLO26替换EfficientNetV2主干:神经架构搜索(NAS)的最优解嫁接

YOLO26引入EfficientNetV2作为Backbone的改进方案探索了计算机视觉模型优化的前沿方向。文章首先分析了YOLO26默认C3k2模块的局限性,指出其在通道利用效率和缩放策略上的不足。随后重点介绍了EfficientNetV2的核心优势,包括Fused-MBConv模块、训练感知的NAS搜索空间和渐进式学习策略,这些特性使其在精度和效率上保持领先。最后提出了将EfficientNetV2嫁接至YOLO26的具体方案,强调通道对齐这一关键挑战,并给出两种解决方案。这一改进思路展现了&quot

ZDQ58818的博客 309

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

有n个数,两两组成二元组,相差最小值是多少?有多少对呢?

Scanner sc=new Scanner(System.in); System.out.println(“请输入数字,用,分隔,按回车结束输入:”); String s=sc.nextLine(); //得到string类型的单个数字 String [] a=s.split(","); //转化成int类型并存入数组 int [] aa=new int[a.length]; int i=0; ...

yandada1314的博客 658

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

剑指offer(C++)——旋转数组的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路分析: 最直观的解法就是从头到尾遍历一遍数组,找出最小数字。时间复杂度

YF_Li123的博客 1397

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【LeetCode】【二分查找】剑指 Offer 11. 旋转数组的最小数字 思路解析和代码

剑指 Offer 11. 旋转数组的最小数字 题目链接 个人思路 题意 题目中的数组被分割成两部分,且两部分均为递增序列,找出序列中的最小元素,要利用递增数组的特性,要采用二分查找 思路 循环条件:根据旋转数组的特点,序列应满足第一个元素大于最后一个元素(特例1,2,3,4,5) 二分查找(此处的mid,left,right表示数值):如果mid大于等于left,说明mid属于前一个递增数组,最小元素应该在mid 的后面;如果mid小于等于right,说明mid属于后一个递增数组,最小元素应该在mid前面

九筒的博客 150

第11题:旋转数组的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。   考点:二分查找法 如果从头到尾遍历,时间复杂度是O(N),用二分查找法的时间复杂度是O(logn)。...

Lightmare625 205
上一篇: 求最大子矩阵的和、求最大子数组的和
下一篇: 网易春招2017真题2——赶去公司
say_haha
博客等级 码龄13年 48粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值