01背包問題JAVA實現

來源:互聯網
上載者:User

標籤:java實現   rate   bsp   util   最大的   01背包問題   div   參數   ring   

在刷華為機試的線上編程,碰到一個類似01背包問題的題目,綜合了一些資料,寫一些自己的理解

01背包問題就是在有限的稱重容量下,求最大價值的問題

假設幾個參數:

w[i]:第i個物品的重量;

p[i]:第i個物品的價值;

v[i][j]:表示在前i個物品中,總重量為j時的最大價值;

v[i-1][j-w[i]]:表示前i-1個物品中,加入第i個物品後的承重容量下的最大價值;

我們分析:在加入第i件物品前,我們要考慮要不要加進去,不加進去,那麼就是v[i][j]=v[i-1][j];如果加進去,那麼v[i][j]=v[i-1][j-w[i]]+p[i]

具體的例子例如

有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的背包,如何讓背包裡裝入的物品具有最大的價值總和?

首先要明確這張表是至底向上,從左至右產生的。

為了敘述方便,用e2儲存格表示e行2列的儲存格,這個儲存格的意義是用來表示只有物品e時,有個承重為2的背包,那麼這個背包的最大價值是0,因為e物品的重量是4,背封裝不了。

對於d2儲存格,表示只有物品e,d時,承重為2的背包,所能裝入的最大價值,仍然是0,因為物品e,d都不是這個背包能裝的。

同理,c2=0,b2=3,a2=6。

 

那麼狀態轉移方程就可以表示為:

v[i][j]=max{v[i-1][j],v[i-1][j-w[i]]+p[i]}

那麼代碼實現如下:

import java.util.*;public class Main {public static void main(String[] args) {// TODO Auto-generated method stubint weight = 10;int n = 3;int[] w = {3,4,5};int[] p = {4,5,6};System.out.println(getMaxweight(w, p, weight, n));}public static int getMaxweight(int[] w, int[] p, int weight, int n){int[][] value = new int[n+1][weight+1];for(int i = 1;i<=n;i++){for(int j = 1;j<=weight;j++){//當物品為i件重量為j時,如果第i件的重量(w[i-1])小於重量j時,c[i][j]為下列兩種情況之一://(1)物品i不放入背包中,所以c[i][j]為c[i-1][j]的值//(2)物品i放入背包中,則背包剩餘重量為j-w[i-1],所以c[i][j]為c[i-1][j-w[i-1]]的值加上當前物品i的價值if(w[i-1]<=j){value[i][j]=Math.max(value[i-1][j], value[i-1][j-w[i-1]]+p[i-1]);}}}return value[n][weight];}}

  

01背包問題JAVA實現

聯繫我們

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