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