AcWing 10 有依賴的揹包問題

2022-05-23 20:30:14 字數 1709 閱讀 3293

有 n

'>n

n 個物品和乙個容量是 v

'>v

v 的揹包。

物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父節點。

如下圖所示:

如果選擇物品5,則必須選擇物品1和2。這是因為2是5的父節點,1是2的父節點。

每件物品的編號是 i

'>i

i,體積是 v

i'>vi

vi,價值是 w

i'>wi

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

i'>pi

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

'>1…n

1…n。

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

輸出最大價值。

輸入格式

第一行有兩個整數 n,v

'>n,v

n,v,用空格隔開,分別表示物品個數和揹包容量。

接下來有 n

'>n

n 行資料,每行資料表示乙個物品。

第 i'>i

i 行有三個整數 vi,

wi,p

i'>vi,wi,pi

vi,wi,pi,用空格隔開,分別表示物品的體積、價值和依賴的物品編號。

如果 pi=

−1'>pi=−1

pi=−1,表示根節點。 資料保證所有物品構成一棵樹。

輸出格式

輸出乙個整數,表示最大價值。

資料範圍1≤

n,v≤

100'>1≤n,v≤100

1≤n,v≤1001≤

vi,w

i≤100'>1≤vi,wi≤100

1≤vi,wi≤100

父節點編號範圍:

輸入樣例

5 7

2 3 -1

2 2 1

3 5 1

4 7 2

3 6 2

輸出樣例:
11

揹包九講中有依賴的揹包問題

#include#include

#include

using

namespace

std;

const

int maxn = 105

;int n, v, p, root, ind=0

;int

v[maxn], w[maxn];

intch[maxn], nxt[maxn], pre[maxn];

intdp[maxn][maxn];

void add(int p,int

i)void dfs(int

u)

for(int i=v;i>=v[u];i--)

dp[u][i] = dp[u][i-v[u]]+w[u];

//for(int i=0;i//

dp[u][i] = 0;

}int

main()

dfs(root);

printf(

"%d\n

",dp[root][v]);

return0;

}

view code

AcWing 10 有依賴的揹包問題

原題鏈結 考察 樹形dp 思路 樹形揹包的時間複雜度是o n3 按劃分給子節點的體積來分配集合.思路與蘋果樹大體相同.關於幾個問題需要解釋下 為什麼不和蘋果樹那題一樣在遍歷點的時候 w u 答 k不一定能裝下,會使得揹包裡的價值多了.除此之外,f u j f u j k f vs k f u j k...

Acwing 10 有依賴的揹包問題

題意 給定一棵樹的關係,每個節點都有對應的體積和價值,限制規則是選擇乙個節點是必須選擇它的父節點,給定總體積 m 問能獲得的最大的價值和是多少?include using namespace std int n,m,root,fa 110 v 110 w 110 dp 110 110 dp i j ...

題解 AcWing10 有依賴的揹包問題

題面 樹形 dp 的經典問題。我們設 dp 表示當前節點為 i 當前節點的子樹 包含當前節點 最多裝的體積是 j 的最大價值。我們遍歷節點的過程就相當於做了一遍分組揹包。注意遍歷完所有子節點後要更新一下狀態。include using namespace std const int maxn 103...