題意:
給定一棵樹的關係,每個節點都有對應的體積和價值,限制規則是選擇乙個節點是必須選擇它的父節點,給定總體積\(m\),問能獲得的最大的價值和是多少?
#include using namespace std;
int n,m,root,fa[110],v[110],w[110],dp[110][110];
//dp[i][j]表示選擇以i節點為根的子樹 總體積不超過j的方案數 可知的是i節點一定要選
//因為選子節點一定要選父節點 不選那子節點擊不了 相當於一棵樹啥也不選
int head[110],tot,nxt[110],to[110];
void add(int u,int v)
void dfs(int u)
for(int i = head[u];i;i = nxt[i])
} }}int main()
add(fa[i],i);
} dfs(root);
cout << dp[root][m] << '\n';
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...
題解 AcWing10 有依賴的揹包問題
題面 樹形 dp 的經典問題。我們設 dp 表示當前節點為 i 當前節點的子樹 包含當前節點 最多裝的體積是 j 的最大價值。我們遍歷節點的過程就相當於做了一遍分組揹包。注意遍歷完所有子節點後要更新一下狀態。include using namespace std const int maxn 103...