DP 揹包系列問題 有依賴的揹包問題

2021-10-02 21:40:43 字數 1433 閱讀 9496

有依賴的揹包問題又是乙個經典的揹包延伸問題,理解她可以讓我們更深刻地理解揹包中三重迴圈的順序邏輯,同時她也是樹形動規的雛形。

題目一般情形:有 n

nn 個物品和乙個容量是 v

vv 的揹包。物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父節點。每件物品的編號是 i

ii,體積是 v

iv_i

vi​,價值是 w

iw_i

wi​,依賴的父節點編號是 p

ip_i

pi​。物品的下標範圍是 1…n

1…n1…

n。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。

動規解法

1、狀態表示:f[i

][j]

f[i][j]

f[i][j

]表示以 i

ii 為根節點的子樹揹包體積為 j

jj 的最大價值

2、狀態轉移:f[i

][j]

=max

,0⩽k

⩽j,0

⩽j⩽v

−v

if[i][j]=max\,0\leqslant k\leqslant j,0\leqslant j \leqslant v-v_i

f[i][j

]=ma

x,0⩽

k⩽j,

0⩽j⩽

v−vi

**與注釋

#include

#include

#include

#include

using

namespace std;

const

int n=

110;

int f[n]

[n],n,v;

int ne[n]

,e[n]

,idx,h[n]

;int v[n]

,w[n]

;void

add(

int p,

int i)

void

dfs(

int u)

for(

int i=v;i>=v[u]

;i--

) f[u]

[i]=f[u]

[i-v[u]

]+w[u]

;for

(int i=

0;i;i++

) f[u]

[i]=0;

}int

main()

dfs(root)

;

cout<[v]

}

有依賴的揹包問題(樹形dp 揹包問題)

acwing 10.有 n 個物品和乙個容量是 v 的揹包。物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父點。如下圖所示 如果選擇物品5,則必須選擇物品1和2。這是因為2是5的父節點,1是2的父節點。每件物品的編號是 i,體積是 vi,價值是 wi,依賴的父節點...

DP複習 有依賴的揹包問題

這類問題是01揹包的變形。所有的物品分為兩類,一類是主件,另一類是附件,每乙個附件都有它的主件,選取它的主件之後才能選取附件。問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只...

分組揹包,混合揹包,有依賴的揹包

一.分組揹包 每組只能選乙個 所謂分組揹包,就是把物品分成n組,每組裡面m個物品,從這n組中每組選乙個物品,使得在揹包體積是v的條件下價值最大 思路 對於每一組由於只能選乙個,所以就是決策這一組中選哪乙個獲得的價值最大 for int i 1 i n i 列舉這是第幾組 num i 代表第i組物品的...