hdoj1011 樹上分組揹包

2022-08-21 18:24:13 字數 966 閱讀 5099

題意:給定一顆樹,每個結點有兩個屬性,即花費v和價值w,並且選擇子結點時必須選擇父結點,求總花費不超過m的最大價值。

思路:樹上分組揹包。和poj1155相似,對於結點u,先遞迴計算其子結點v的dp值,然後對於每個子結點所代表的子樹,最多只有一種選擇方案,不能重疊,所以是分組揹包。dp[u][j]表示對結點u表示的子樹,容量為j時的最大價值。dfs時的num表示從根節點到u的花費(including u),計算結點u時,列舉容量從大到小,容量最大為m-num。

我是先討論選擇u的子結點的情況,最後討論選不選u,容量從大到小遍歷,最大為m-num+v[u],注意和前面的m-num不同(前面的實際上是u的子結點的最大容量,此處的才是u代表的子樹的最大容量)。

ac**:

#include#include

using

namespace

std;

const

int maxn=105

;int

n,m,cnt,head[maxn],v[maxn],w[maxn],dp[maxn][maxn];

struct

nodeedge[maxn

<<1

];void adde(int u,int

v)void dfs(int u,int fa,int

num)

for(int j=m-num+v[u];j>0;--j)

if(j>=v[u]) dp[u][j]=dp[u][j-v[u]]+w[u];

else dp[u][j]=0;}

intmain()

for(int i=1;i<=n;++i)

for(int i=1;ii)

dfs(

1,0,v[1

]); printf(

"%d\n

",dp[1

][m]);

}return0;

}

hdu1561 樹上分組揹包

hdu1561 樹上揹包模板題 題意大概是給一棵樹,每個點有相應的權值,從樹根開始選取m個連通的點然後使得獲得的點權最大。我們假設dp u j 為以u點為根時,向下選取j個點獲得的最大權值。v為u的子節點,那麼可以看出其實當u點可以最多向下取p個點的時候,u點可以視為乙個容量為p的揹包,物品為dp ...

HDU4003 樹上的分組揹包

我們在s節點上有k個機械人,現在我們派遣這k個機械人出去隨便走,要求在最短距離裡遍歷整棵樹 for 所有的組k for 所有的物品i屬於組k for j w.w i f j max f j f j w i v i 至於樹上的分組揹包,也差不多。但是對於此題,我們用f i j 表示i節點為根的子樹被派...

通天之分組揹包 分組揹包

本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 傳送門 分組揹包的模板 偽 1 for int i 1 i 組數 i 6 7 直接套模板即可。code 1 include2 pragma gcc optimize 3 3const int n 1e5 10 4 using namesp...