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) ;}}
但是遞迴畢竟是一種效率上不佔優的演算法。
感興趣的猿們可以 自己嘗試一些更優解。或是給出一種方案 解決 一類 問題。這應該會是件 有意思的事情吧?!