給定一組多個(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
∑nx
ivi
,s.
t.i=
1∑n
xiw
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
axi
=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 ...