有依賴的揹包問題又是乙個經典的揹包延伸問題,理解她可以讓我們更深刻地理解揹包中三重迴圈的順序邏輯,同時她也是樹形動規的雛形。
題目一般情形:有 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組物品的...