分堆数据问题

该博客讨论了一个数组分堆问题,目标是将N个整数分为两堆,使两堆数据之和的差值最小。问题转化为求集合的子集问题,博主提出通过全排列的递归算法来解决,但指出递归效率不高,并鼓励读者寻找更优解法,以解决此类问题。
摘要由CSDN通过智能技术生成

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(l
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值