`
xiaocai1988
  • 浏览: 7323 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

数组分割问题

阅读更多

题目:有一个无序、元素个数为2n的正整数数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组之和最接近?

看了编程之美的算法,一直在想算法只求出了最接近的那个和值,没有求出分割的具体分法,后来想想,这个具体的分割的索引值,可以在求和值的时候一起保存下来。代码有点乱,凑活看吧。

 

import java.util.*;
class Node{
	int value;
	List index = new ArrayList();
}
public class Main{
	public static void main(String[] args){
		int a[] = {1,5,7,8,9,6,3,11,20,17};
		//题意保证了a.length一定为偶数
		int n = a.length/2;
		int sum = 0;
		//Heap[i]表示存储从a中取i个数所能产生的和之集合的集合
		List[]  Heap = new List[n+1];
		for(int i=0;i<n+1;i++){
			Heap[i] = new ArrayList();
		}
		
		//计算数组总和
		for(int i=0;i<2*n;i++){
			sum += a[i];
		}
		//初始化Heap[0]
		Node node = new Node();
		node.value = 0;
		Heap[0].add(node);
		
		
		for(int k=1;k<=2*n;k++){
			int updateIndex = min(n-1,k-1);
			for(int j=updateIndex;j>=0;j--){
				for(int i=0;i<Heap[j].size();i++){
					Node oldNode = (Node)Heap[j].get(i);
					int num = oldNode.value;
					List list = oldNode.index;
					//只加入小于等于sum/2的那些值
					if(num+a[k-1]<=sum/2){
						Node newNode = new Node();
						newNode.value = num+a[k-1];
						Iterator iterator = list.iterator();
						while(iterator.hasNext()){
							newNode.index.add(iterator.next());
						}
						newNode.index.add(k-1);
						Heap[j+1].add(newNode);
					}
				}
			}
		}
		//实现比较
		Comparator orderValue = new Comparator(){
			public int compare(Object o1, Object o2){
				Node n1 = (Node)o1;
				Node n2 = (Node)o2;
				return  n1.value-n2.value;
			}
		};
		Collections.sort(Heap[n],orderValue);
		Node h_node = (Node)Heap[n].get(Heap[n].size()-1);
		System.out.println(h_node.value);
		List h_list = h_node.index;
		for(int i=0;i<h_list.size();i++){
			System.out.print(h_list.get(i)+" ");
		}
		System.out.println();
	}
	private static int min(int x, int y){
		return x<y?x:y;
	}
}
分享到:
评论

相关推荐

    数组分割问题(印象深刻)1

    数组分割问题的动态规划解决方案 数组分割问题是一种经典的动态规划问题,旨在将一个无序的正整数数组分割为两个子数组,使得两个子数组之和最接近。该问题可以拆分为两个子问题:一是将数组分割为两个元素个数不限...

    基于C++实现编辑距离问题、货物堆积问题、骑士周游问题、数组分割问题、资源分配问题、最长上升子序列问题

    这些问题是编辑距离问题、货物堆积问题、骑士周游问题、数组分割问题、资源分配问题以及最长上升子序列问题。我们将逐一深入探讨这些知识点。 1. **编辑距离问题**: 编辑距离(Levenshtein Distance)是衡量两个...

    数组分割1

    接下来,问题转换为在一个包含2n个正数的数组中,找出n个元素,使得这n个元素之和与剩下的n个元素之和的差最小。 《编程之美》2.18节的解法二指出,从2n个数中选n个,可以考虑元素和大于、小于或等于总和的一半...

    函数_数组分割_python大数据分析与应用之函数的用法_源码

    数组分割是数据分析过程中的关键操作,它能够帮助我们有效地处理和理解大量数据。 首先,Python中的数组通常由numpy库提供支持。Numpy是科学计算的核心库,提供了高性能、多维数据结构,如ndarray(n-dimensional ...

    php使用array_chunk函数将一个数组分割成多个数组

    PHP提供了一个内置函数array_chunk,它可以将一个数组分割成多个数组,每个数组包含指定数量的元素。本文将详细介绍array_chunk函数的用法和相关注意事项。 首先,array_chunk函数的基本用法如下: ```php array_...

    根号n段归并排序算法

    对于排序,就是将一个大数组分割成两个或多个小数组,分别对它们进行排序,然后将这些已排序的小数组合并成一个大的有序数组。在根号n段归并排序中,我们首先将数组分成约根号n个尽可能相等的部分,然后采用两两合并...

    asp textarea 多行数组分割处理方法

    在分割数组之后,还需要确定数组的长度,因为数组的最后一个元素可能是空字符串。文章中通过For...Next循环来实现,直到倒数第二个数组元素结束,这样避免了数组越界的错误。 当数组被正确分割后,文章接着展示了...

    PTA填空啊啊啊啊啊啊啊啊

    快速排序是另一个经典的算法问题,它的主要思想是将数组分割成两个部分,然后递归地排序这两个部分。快速排序的时间复杂度为 O(n log n),是非常高效的排序算法。 在快速排序中,我们首先需要定义一个结构体 `...

    js代码-一组分割成多组

    首先,我们要理解JavaScript中的数组方法,如`slice()`、`splice()`、`concat()`等,这些方法在处理数组分割问题时经常会用到。但这里的核心是创建一个新的函数,用于将数组按照指定大小进行分割。 我们可以创建一...

    数组最大值最小值_数组最大值最小值_最小值_

    3. **并行计算**:在多核处理器或分布式系统中,可以将数组分割成多个部分,每个部分分别找最大值和最小值,然后合并结果。这种方法在大数据处理中常用,但实现起来较为复杂。 4. **分治法**:对于大型数组,可以...

    最大子数组

    对于最大子数组问题,我们可以将其分解为两个半部分,分别求解左右两半的最大子数组,再考虑跨越分割点的最大子数组。 具体步骤如下: 1. **分割阶段**:将数组 `A` 分为两个相等或接近相等的部分 `A_left` 和 `A_...

    分治策略 线性时间选择

    该算法使用了分治策略,通过将数组分割成更小的子数组,然后逐步解决这些子数组,最后合并结果以选择第k小的元素。 3. 分治策略在线性时间选择中的应用 在线性时间选择中,分治策略被用于将数组分割成更小的子数组...

    Objective-C数组操作总结

    8. **数组分割与合并**: - `componentsSeparatedByString:`方法以给定的字符串作为分隔符,将原字符串分割成数组。 - `componentsSeparatedByCharactersInSet:`方法以字符集合中的每个字符为分隔符进行字符串分割...

    京东数科算法整理.pdf

    arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成多少块?

    易语言快速判断数组中的数值源码.rar

    7. 数组遍历优化:对于大量数据,可以使用并行处理或多线程技术,将数组分割成多个部分,分别在不同的处理器核心上进行判断,从而提高效率。 通过分析提供的源码,我们可以学习到易语言中处理数组的技巧和方法,...

    易语言赋值定义多维数组

    除此之外,易语言还提供了丰富的数组操作函数,如数组的合并、分割、排序等,可以帮助开发者更加灵活地处理多维数组。学习和掌握易语言中的多维数组,不仅可以提高程序的效率,还能使程序结构更加清晰,便于理解和...

    后缀数组倍增算法实现

    它将数组分割成多个子数组,每个子数组的大小约为sqrt(n)。对于每个子数组,预先计算出最小值,然后在查询时只需比较相邻子数组的最小值即可得到整个区间的最小值。ST算法的时间复杂度为O(n + q sqrt(n)),其中n是...

    Halcon入门20条必备知识(基础算子、高阶算子、数组、分割、字符检测、模板匹配、特别案例)

    内容涵盖了Halcon的基础算子、高阶算子、数组操作、分割算法、字符检测、模板匹配、特征点检测与描述、3D重建、图像配准、图像融合、视频处理、机器学习与深度学习、实时图像处理、交互式图像处理、图像质量评价、...

Global site tag (gtag.js) - Google Analytics