背包問題-java實現

來源:互聯網
上載者:User

 

  背包問題 背包問題是電腦科學裡的經典問題。在最簡單的形式中,包括試圖將不同重量的資料項目放到

  背包中.以使背包最後達到指定的總重量。不需要把所有的選項都放入背包中。 舉例來說,假設想要背包精確地承重20磅,並且有5個可以選擇   放入的資料項目,它們的重量

  依次為11磅、8磅、7磅、6磅和5磅。對於選擇放入的資料項目數量不大時,人類很善於通過觀察

  就可以解決這個問題。於是大概可以計算出只有8磅、7磅和5磅的資料項目加在一起和為20磅。 如果想要電腦來解決這個問題,就需要給計算     機更詳細的指令。

  

  演算法如下: 

  1.如果在這個過程中的任何時刻,選擇的資料項目的總和符合目標重量,工作就完成了。

  2.從選擇第一個資料項目開始。剩餘的資料項目的加和必須符合背包的目標重量減去第一個資料 項的重量;這是一個新的目標重量。

  3.逐個地試每種剩餘資料頂組合的可能性。但是,注意並不需要去試所有的組合,因為只要 資料頂朗和大於目標重量的時候,就停止添加資料項目。

  4.如果設有組合合適的話,放棄第—‘個資料項目,並且從第二個資料項目開始再重複一邊整個 過程。

  5.繼續從第三個資料項目開始,如此下去直到你已經試過所有的組合,這時知道沒有解決答案。

 

 

public class Beibao {<br />static int[] a = new int[5]; // 背包重量<br />static int[] b = new int[5]; // 結果數組<br />static int flag = 0; // 下一個候選項<br />static int bound = 20; // 總重量<br />static int totle = 0; // 每次選擇後的總重量<br />/**<br /> * 背包<br /> *<br /> * @param i<br /> * 元素座標<br /> * @param leftbound<br /> * 目標重量<br /> * @param t<br /> */<br />public static void inserttry(int i, int leftbound, int t) {<br />if (i < 5 && leftbound <= totle) {<br />if (a[i] < leftbound) { // 當前的所選的數小於已選數的總和,將當前所選的數放入結果數組,從目標重量減掉當前所選數,遞迴,選擇後的重量數減掉當前所選數<br />b[t++] = a[i];<br />totle = totle - a[i];<br />leftbound = leftbound - a[i];<br />i++;<br />inserttry(i, leftbound, t);<br />} else if (a[i] > leftbound) { // 當前的所選的數大於已選數的總和,不符合條件,選擇後的重量數減掉當前所選數,遞迴<br />totle = totle - a[i];<br />i++;<br />inserttry(i, leftbound, t);<br />} else { // 當前所選的數等於已選數的總和<br />b[t] = a[i];<br />return;<br />}<br />} else { // 數組中沒有符合當前條件的元素,將前一個數值移除,遞迴<br />leftbound = leftbound + b[--t];<br />for (int f = 0; f < 5; f++) {<br />if (a[f] == b[t]) {<br />flag = ++f;<br />break;<br />}<br />}<br />b[t] = 0;<br />totle = 0;<br />for (int m = flag; m < 5; m++) {<br />totle += a[m];<br />}<br />inserttry(flag, leftbound, t);<br />}<br />return;<br />}<br />public static void main(String[] args) {<br />a[0] = 11;<br />a[1] = 8;<br />a[2] = 6;<br />a[3] = 7;<br />a[4] = 5;<br />for (int i = 0; i < 5; i++) {<br />b[i] = 0;<br />}<br />for (int i = 0; i < 5; i++) {<br />totle += a[i];<br />}<br />inserttry(0, 20, 0);<br />for (int i = 0; i < 5; i++) {<br />System.out.println(b[i]);<br />}<br />}<br />}<br />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.