標籤: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實現