现在的位置: 首页 > 综合 > 正文

分堆数据问题

2013年05月27日 ⁄ 综合 ⁄ 共 961字 ⁄ 字号 评论关闭

1,问题:有一个含有N个整型数据的数组,将这个数组中的元素分为2堆,使得2堆数据的和之差最小。

 

最初看到这个题目,第一反应是循序遍历数组,加之,(有点贪心算法的味道),后思不可解。

 

于是继续探索,将这个问题 转换一下,可知 实际上可以转换为 求解 一个集合的子集问题:

因为 一个数组中所有的N个元素, 用一种方法取走m<=N个元素 , 那么剩下的N-m个元素自然就属于剩下的一堆。

 

由   划分成两堆数据  => 取出一些元素 ,并且 附加条件就是 取出的所有元素之和sum1 趋向于 数组所有元素之和 sum 的一半。

 

2,全排列的递归算法解决:

package net.mldream.algorithm.pr ;

public class Pr01 {

	public static void swap(int[] num, int a, int b) {
		int temp = num[a] ;
		num[a] = num[b] ;
		num[b] = temp ;
	}
	public static void printArray(int[] num,int low, int n) {
		for(int i=low;i<=n;i++) {
			System.out.print(num[i]+" + ") ;
		}
	}

	public static void getAll(int[] num, int low, int high) {
		//printArray(num,low,high) ;
		if(low > high) {
			for(int i = 0; i <= high; i++)             
            System.out.print(num[i]);         
        System.out.println("");  
		} else {
			for(int i=low;i<=high;i++) {
				swap(num,low,i) ;
				
				//System.out.println("num[0]:"+num[0]+" low:" +low+" high:"+high) ;
				getAll(num,low+1,high) ;
				swap(num,low,i) ;
			}
		}
	}

	public static void main(String[] args) {
		int[] num = {1,2,3} ;
		getAll(num,0,2) ;
		//printArray(num, 5) ;
	}
}

 

但是递归毕竟是一种效率上不占优的算法。

感兴趣的猿们可以 自己尝试一些更优解。或是给出一种方案 解决 一类 问题。这应该会是件 有意思的事情吧?!

抱歉!评论已关闭.