Leetcode 0 1揹包問題

2021-10-23 03:20:43 字數 1271 閱讀 2918

什麼是揹包問題?

比如有n個物品,它們有各自的體積和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?(0/1揹包問題就是這n個物品中某乙個物品選還是不選,分別表示1和0)

題目描述

比如有n個物品,它們有各自的體積w和價值v,現有給定容量的揹包ba**,如何讓揹包裡裝入的物品具有最大的價值總和?

解題步驟:

在解決問題之前,為描述方便,首先定義一些變數:vi表示第 i 個物品的價值,wi表示第 i 個物品的體積,定義v(i,j):當前揹包容量 j,前 i 個物品最佳組合對應的價值,同時揹包問題抽象化(x1,x2,…,xn,其中 xi 取0或1,表示第 i 個物品選或不選)。

1、建立模型,即求max(v1x1+v2x2+…+vnxn);

2、尋找約束條件,w1x1+w2x2+…+wnxn3、尋找遞推關係式,面對當前商品有兩種可能性:

4、填表,首先初始化邊界條件,v(0,j)=v(i,0)=0;v[i,v]是說從前i個物品中挑出物品,將他們放入體積為v的揹包可以獲得的最大價值。v[0,1…n]. 可以看做是從前0個物品中挑選,放入體積分別為0,1,…,n的揹包。f[0,1…n]可以看做是最簡化的01揹包問題了。

然後一行一行的填表:

5、輸出,**填完,最優解即v(number,capacity)=v(4,8)=10。

**:

public

class

test1

;//商品的體積2、3、4、5

int[

] v =

;//商品的價值3、4、5、6

int ba** =8;

//揹包大小

system.out.

println

(t1.

knapsack

(w, v, ba**));

}public

intknapsack

(int

w,int[

] v,

int ba**)

//如果不大於剩餘體積,則取待新增物品 加入或不加入揹包後的最大值

else}}

return dp[w.length-1]

[ba**];}

}

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...

揹包問題 01揹包

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...