数组:正整数数组分成2组使其和的差的绝对值最小

【问题描述】

把正整数数组 a[N] 中的N个元素任意划分成2部分,使得这2部分和的差的绝对值最小。

【算法思路】

问题可转换成,从数组中找出一组数据,使之尽可能等于数组和sum的一半。那么必然有他一半的和是 <= sum/2,接下来用0-1背包问题来解!

现在数组元素即物品,元素值即使是背包问题中的物品weight,也是物品的value,即二者一样,背包容量C = sum/2。问题就是现在满足背包容量情况下,装哪些物品,使得其价值之和最大。

【代码】

参见本博客的 “DP:0-1背包问题“   http://www.cnblogs.com/JesusAlone/p/7465878.html

时间: 2024-10-20 18:39:31

数组:正整数数组分成2组使其和的差的绝对值最小的相关文章

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

题目: 数组中的数分为两组,给出一个算法,使得两个组的和的差的绝对值最小数组中的数的取值范围是0<x<100,元素个数也是大于0,小于100比如a[]={2,4,5,6,7},得出的两组数{2,4,,6}和{5,7},abs(sum(a1)-sum(a2))=0; 比如{2,5,6,10},abs(sum(2,10)-sum(5,6))=1,所以得出的两组数分别为{2,10}和{5,,6}. 思路: 初看问题,感觉好像是个组合问题,通过暴力穷举解决问题. 但仔细想想,问题可以转换成,从数组中找

将1、2、3、……、81这八十一个连续自然数分成三组,使每组的和相等。三组中个数最多的一组有几个?

1 <script type="text/javascript"> 2 window.onload = function() { 3 var n =81; 4 // 求组数 5 var zushu = Math.floor(n / 2); 6 var sum = (1 + 81) * (zushu) + (zushu + 1) * (n % 2); 7 console.log("总和为:" + sum); 8 var avg = sum / 3; 9 c

数组中两个元素差的绝对值最小

#include <stdio.h> #include <stdlib.h> /* 给定一个含有n个元素的整型数组, 找出数组中的两个元素x和y使得abs(x - y)值最小 */ /* 思路: 排序, 然后遍历数组比较相邻值相减得到的值 */ typedef struct{ int num1; int num2; }TwoNumber; TwoNumber getTNumber(int* numbers, int length); int cmp(const void *a,co

整数数组中两两之差绝对值最小的值

题目1: 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数. 题目2:请求出最小连续子序列绝对值和,也就是求连续子序列之和的绝对值最小值 针对问题1: 方法<1>:暴力的方式.遍历所有的两个数的差,记录最小值.算法的复杂度O(n2) 方法<2>:两个数要想差的绝对值最小,肯定是需要两个数大小相近.故有思路:先对数组进行排序,然后遍历一遍,相邻的数相减,记录绝对值最小的数. 方法<3>:将现在的问题进行转化: 设这个整数数组是a

求数组中绝对值最小的元素

给定一个有序数组a(从小到大排列),数组中的数据有正有负,找出这个数组中的绝对值最小的元素.最先到的自然是从头到尾依次遍历数组中的每个元素,找出绝对值最小的元素.这是最简单的方法,不过它并没有用到数组有序这个特性,现在我们来看看有没有更好的方法.题目要求在数组中查找元素,并且此数组有序,那么可以想到用二分法来处理. 首先我们先看一下如果数组中元素全部为正数或者全部为负数的情况: 如果a[0]>0,那么数组中所有元素均为正数,则a[0]为绝对值最小的元素 如果a[len-1]<0,那么数组中所有

二维数组求最大连通子数组的和

题目:返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数,当然,行数和列数都是正整数. 源程序 /* 设计思路: 1.首先从文件读入一个二维整型数组(有正有负): 2.从数组中选出最小的一个数,如果为负数则除去,检验联通性: 3.联通,接下来找剩余中最小的数,

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

返回一个二维整数数组中最大联通子数组的和6

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 #include<ios

求二维整数数组中最大联通子数组的和

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 1 #include<i