題解 AcWing10 有依賴的揹包問題

2022-07-02 11:18:13 字數 694 閱讀 8243

題面

樹形 dp 的經典問題。

我們設 \(dp_\) 表示當前節點為 \(i\),當前節點的子樹(包含當前節點)最多裝的體積是 \(j\) 的最大價值。

我們遍歷節點的過程就相當於做了一遍分組揹包。

注意遍歷完所有子節點後要更新一下狀態。

#include using namespace std;

const int maxn = 103;

int n, m;

int tot, head[maxn], ver[maxn * 2], nxt[maxn * 2];

int dp[maxn][maxn];

int v[maxn], w[maxn], p[maxn];

inline void add(int u, int v)

void dfs(int u, int f)

//更新狀態

for (int i = m; i >= v[u]; i-=1) dp[u][i] = dp[u][i - v[u]] + w[u];

for (int i = 0; i < v[u]; i+=1) dp[u][i] = 0;

}int main()

dfs(rt, 0);

cout << dp[rt][m] << endl;

return 0;

}

AcWing 10 有依賴的揹包問題

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

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 ...