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

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 stubScanner 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 stubint 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]);}}

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

  1. 算法题:找出整数数组中两个只出现一次的数字

    问题:一个整数数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1). 分析:这是一个很新颖的关于位运算的题目. 首先考虑这 ...

  2. 找出数组中两个只出现了一次的数

    原题:给一组数,只有两个数只出现了一次,其他所有数都是成对出现的.怎么找出这两个数. 编写函数实现. 对于一组数中只有一个数只出现一次,其他所有数都是成对出现的,我们采用了对全部数组元素进行异或,经过 ...

  3. (笔试题)将数组分成两组,使两组的和的差的绝对值最小

    题目: 数组中的数分为两组,给出一个算法,使得两个组的和的差的绝对值最小数组中的数的取值范围是0<x<100,元素个数也是大于0,小于100 比如a[]={2,4,5,6,7},得出的两组 ...

  4. android应用资源可以分为两大类,Android 应用资源(一)

    Android 应用资源想必大家都很熟悉了,这里我只讲一些细小的容易忽视的一些东西: 一. 应用资源概述 1.Android的应用资源可以分为两类: (1)无法通过R资源反问的原生资源,保存在asse ...

  5. 微策略2011校园招聘笔试题(找出数组中两个只出现一次的数字)

    1.8*8的棋盘上面放着64个不同价值的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0),一个人初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下 ...

  6. 在c语言程序中将数据分为两种,2012年计算机二级C语言考点归纳汇总(一至四章)...

    第1章程序设计基本概念考点归纳 1.1 C语言的特点 C语言是近年来非常流行的语言,很多人宁愿放弃已经熟悉的其他语言而改用C语言,其原因是C语言有优于其他语言的一系列特点.下面是C语言的主要特点: ( ...

  7. js中的数据类型分为两大类分别是什么_数据类型有这么重要吗?

    一个没有得到重视的知识点, 数据类型 每种语言都有自己的数据类型,下面以javascript为例 类型的分类 js的数据类型可以分为 两大类: 1,值类型 (String,Number,undefin ...

  8. 【算法14】找出数组中两个只出现一次的数字

    [题 目]一个整型数组中除了两个数字外,其他的数字都出现两次.请找出这两个只在数组中出现一次的数字.要求时间复杂度O(n),空间复杂度O(1). [思 路]首先我们考虑一个稍微简单点的情况:如果这个数 ...

  9. python两两组合_求数组中两两相加等于20的组合(Python实现)

    题目 求数组中两两相加等于20的组合. 例:给定一个数组[1, 7, 17, 2, 6, 3, 14],这个数组中满足条件的有两对:17+3=20, 6+14=20. 解析 分为两个步骤: 先采用堆排 ...

  10. 数组中有两种数出现奇数次,其他数出现偶数次,打印奇数次的数

    一个数组中有两种数出现了奇数次,其他数出现了偶数次,怎么找出打印这两种数 这个问题我们涉及到异或运算 和 怎么将一个数的最右边取出来 有这样一个结论 1.任何数异或0 都为自己本身 2.任何数和自己异 ...

最新文章

  1. Windbg无源码调试驱动
  2. Scala概述及学习Scala的优势
  3. mysql免密码登录, 及使用-e 参数执行sql脚本
  4. 设计模式:原型模式(C++)【克隆羊多莉】
  5. CreateThread线程函数
  6. 我的世界服务器怎么在计分板上面显示,我的世界计分板指令教程 计分板指令怎么使用...
  7. HDFS数据平衡:节点间平衡与节点内平衡
  8. c++ 队列_RabbitMQ的死信与延迟队列,你真的会用吗?
  9. window自动生成数据库连接字符串
  10. SQL server2019安装教程
  11. 如何查看网站是否CDN加速?测试网站全国访问速度的方法!
  12. veu +Apipost下拉框选项绑定数据库
  13. c语言布丰投针源码,布丰投针数学分析及实验设计(原创).pdf
  14. 汉字转拼音函数SQLSERVER数据库
  15. 【福利帖】当我谈学习视觉时,我谈些什么
  16. 微信小程序 MinUI 组件库系列之 label 标签组件
  17. maven plugins 飘红问题
  18. android 浏览器横屏,2013安卓平台浏览器横屏
  19. 2018 ACM ICPC Arabella Collegiate Programming Contest A
  20. 中科云谷正式落户上海临港 构筑工业互联网新图景

热门文章

  1. oeasy教您玩转python - 4 - # 调试程序
  2. RTCP 协议的 NACK 报文
  3. 中国地产商寻找下一个春天 1
  4. oracle类型number,Oracle NUMBER 类型细讲
  5. 对话|Imagination推出B系列GPU IP,力挺本土芯片的图形渲染和AI创新
  6. git放弃本地修改:
  7. Golang——从入门到放弃
  8. HarmonyOS(鸿蒙)——单击事件
  9. catia如何单击停止捕获_CATIA打开文件时显示单击确定终止
  10. python极速入门(适合有基础)