我的筆試題記錄 0 1揹包問題

2021-10-09 23:59:37 字數 2749 閱讀 5799

給定一組多個(n

nn)物品,每種物品都有自己的重量(w

iw_i

wi​)和價值(v

iv_i

vi​),在限定的總重量/總容量(c

cc)內,選擇其中若干個(也即每種物品可以選0個或1個),求能取得的最大價值。

用更抽象的話說,給定正整數1≤w

i≤n,

1≤vi

≤n,1

≤c≤n

1 \leq w_i \leq n, 1 \leq v_i \leq n, 1 \leq c \leq n

1≤wi​≤

n,1≤

vi​≤

n,1≤

c≤n,求:

m ax

∑i=1

nxiv

i,s.

t.∑i

=1nx

iwi≤

c,x∈

max\sum_^nx_iv_i, s.t.\sum_^nx_iw_i \leq c, x \in \

maxi=1

∑n​x

i​vi

​,s.

t.i=

1∑n​

xi​w

i​≤c

,x∈動態規劃

定義d p(

i,w)

dp(i, w)

dp(i,w

)為在前i個物品中篩選出總重量不超過w的最大價值。

轉移方程:

對於第i個物品,有兩種做法: 當w

i>

ww_i>w

wi​>

w時,第i

ii個物品不可能放入揹包中,此時dp(

i,w)

dp(i, w)

dp(i,w

)只能取第二種做法。當wi≤

ww_i \leq w

wi​≤

w時,需要比較兩種做法哪一種能獲取較高的價值。得到轉移方程:

d p(

i,w)

=oth

erwi

se

dp(i, w)= \begin 0 & i=0 \\ 0 & w=0 \\ dp(i-1, w) & w_i>w \\ max\ & otherwise \end

dp(i,w

)=⎩⎪

⎪⎪⎨⎪

⎪⎪⎧​

00dp

(i−1

,w)m

ax​i

=0w=

0wi​

>wo

ther

wise

​ **(c++):

/**

* @param itemcount 物品個數

* @param weight 物品重量,weight[i]表示第i個物品的重量(i從1開始)

* @param value 物品價值,value[i]表示第i個物品的價值(i從1開始)

* @param maxload 揹包的最大負重

*/int

maxvalue

(int itemcount, vector<

int> weight, vector<

int> value,

int maxload)}}

return dp[itemcount]

[maxload]

;}

通過這個dp陣列求出選擇的物品編號:

從i =n

,j=c

i=n, j=c

i=n,j=

c開始看,若dp(

i−1,

j)=d

p(i,

j)

dp(i-1, j) = dp(i, j)

dp(i−1

,j)=

dp(i

,j),則表示第i

ii個物品沒有被選擇,則從dp(

i−1,

j)

dp(i-1, j)

dp(i−1

,j)繼續尋找。如果dp(

i−1,

j)≠d

p(i,

j)

dp(i-1,j) \neq dp(i, j)

dp(i−1

,j)

​=dp

(i,j

),則表示第i

ii個物品被選擇,下一步從dp(

i−1,

j−wi

)dp(i-1, j-w_i)

dp(i−1

,j−w

i​)繼續尋找。

/**

* @param dp 求最大價值時產生的動態規劃陣列dp

* @param weight 物體重量陣列

* @param itemcount 物體個數

* @param maxload 揹包最大負重

*/vector<

int>

finditems

(vector< vector<

int>

> dp, vector<

int> weight,

int itemcount,

int maxload)

else

}return res;

}

本片記錄總結自:

【動態規劃】01揹包問題 - 弗蘭克的貓 - 開發者的網上家園

0-1揹包問題的動態規劃演算法 - 知乎

01揹包刷題記錄

集合a 對於從1到n 1 n 39 的連續整數集合,能劃分成兩個子集合,且保證每個集合的數字和是相等的。舉個例子,如果n 3,對於能劃分成兩個子集合,每個子集合的所有數字和是相等的 和 這是唯一一種分法 交換集合位置被認為是同一種劃分方案,因此不會增加劃分方案總數 如果n 7,有四種方法能劃分集合,...

筆試題14 揹包問題(01 完全 多重)

01揹包 有n件物品和乙個容量為m的揹包。第i件物品的費用 即體積 是w i 價值是 v i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f j max 核心 如下 include using namespace std long f 30000 int...

記錄路徑的01揹包問題

在01揹包問題中,求出最優解並記錄揹包內物品,動態規劃的方法求其問題,最核心的公式為f i j max,在考慮當前第i個物品是否放入的時候就是比較 前面的i 1個物品放在容量為j的揹包中時揹包中總價值與 前面的i 1個物品放在容量為j weight i 的揹包中並加上當前第i個的價值value i ...