hdu1561 树上背包模板题 题意大概是给一棵树,每个点有相应的权值,从树根开始选取m个连通的点然后使得获得的点权最大。
我们假设dp[u][j]为以u点为根时,向下选取j个点获得的最大权值。 v为u的子节点,那么可以看出其实当u点可以最多向下取p个点的时候,u点可以视为一个容量为p的背包,物品为dp[v][k] 物品的代价为k ,价值为dp[v][k],那么就可以当做分组背包来做(即可以从每个子节点v以及v的子孙中选取xi个点,且∑xi = p - 1),但是【这里有个地方要注意,由于要求的是选取连通的点,即当我们选了v点的子节点时,v点也应该一并选取。同理u点本身也必须被选取】,我们可以把dp[u][1] 初始化为 val[u],即该点本身的权值,同时我们稍微改动一下方程的枚举过程即可
for(int j = m ;j > 1; -- j)
for(int k = 1 ; k <= m-1 ;++ k)
if(j > k)
dp[u][j] = max(dp[u][j], dp[u][ j - k] + dp[v][ k ]);
dp[u][1]这个状态不去更新,可以使得dp[u][j] (2 <