分堆資料問題

來源:互聯網
上載者:User

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) ;}}

 

但是遞迴畢竟是一種效率上不佔優的演算法。

感興趣的猿們可以 自己嘗試一些更優解。或是給出一種方案 解決 一類 問題。這應該會是件 有意思的事情吧?!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.