有依賴的揹包問題

2021-10-09 12:52:15 字數 1566 閱讀 7336

題目鏈結

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

如下圖所示:

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

每件物品的編號是 i,體積是 vi,價值是 wi,依賴的父節點編號是 pi。物品的下標範圍是 1…n。

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

輸出最大價值。

輸入格式

第一行有兩個整數 n,v,用空格隔開,分別表示物品個數和揹包容量。

接下來有 n 行資料,每行資料表示乙個物品。

第 i 行有三個整數 vi,wi,pi,用空格隔開,分別表示物品的體積、價值和依賴的物品編號。

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

輸出格式

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

資料範圍

1≤n,v≤100

1≤vi,wi≤100

父節點編號範圍:

內部結點:1≤pi≤n;

根節點 pi=−1;

輸入樣例

5 72 3 -1

2 2 1

3 5 1

4 7 2

3 6 2

輸出樣例:

11做這道題前最好是已經學習過零一揹包問題,

對大雪菜大佬**的理解

通過題目我們知道要選擇的物品存在乙個樹形結構中,而且要選擇他的父節點即為有依賴的揹包問題。

樹形動規問題,首先f[i][j]表示選擇物品i且體積為j時的最大價值,也是以i為根的整顆子樹最大價值,也就是說我們是將某一結點及其子節點作為乙個整體考慮的,這是解體的關鍵

static

int n,m,v[

], w[

],f[

];//f[i][j]表示選擇物品i且體積為j時的最大價值,也是以i為根的整顆子樹最大價值

static list

lists;

public

static

void

main

(string[

] args)

// 以上**建立了一顆樹存在lists裡面連線表儲存方法

dfs(root)

;// 求一定選根節點的情況下總價值多大

// dfs函式 的思路是遍歷root的子節點比較選擇最大值

system.out.

println

(f[root]

[m]);}

// 這個函式是主要**

private

static

void

dfs(

int root)

// 遍歷子節點

for(

int i=

0; i

.size()

; i++)}}}}

有依賴的揹包問題

簡化的問題 這種揹包問題的物品間存在某種 依賴 的關係。也就是說,i依賴於j,表示若選物品i,則必須選物品j。為了簡化起見,我們先設沒有某個物品既依賴於別的物品,又被別的物品所依賴 另外,沒有某件物品同時依賴多件物品。演算法 這個問題由noip2006金明的預算方案一題擴充套件而來。遵從該題的提法,...

有依賴的揹包問題

第二天叫醒我的不是鬧鐘,是夢想!有 n 個物品和乙個容量是 v 的揹包。物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父節點。如果選擇物品5,則必須選擇物品1和2。這是因為2是5的父節點,1是2的父節點。每件物品的編號是 i,體積是 vi,價值是 wi,依賴的父節...

有依賴的揹包問題

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