洛谷 P2015 二叉蘋果樹

2022-06-29 15:57:12 字數 857 閱讀 7711

傳送門

給乙個n個節點的樹,邊帶權值,要求保留q條連通根節點1的邊,求這q條邊最大總權值是多少。

算是乙個樹形揹包的模板題,可以將邊權轉化為子節點的點權來考慮分組揹包,注意本題中如果要選子節點,其父節點也必須被選。

ps.沒注意分組揹包的寫法wa了一發,

第一次for為枚舉子樹

第二次for為列舉當前節點的限重,也就是揹包限重,注意01揹包和完全揹包區別。

第三次for枚舉子樹重量。

#include #include 

#include

#include

using

namespace

std;

intn,q;

int head[110],to[210],nxt[210],len[210],tot,siz[110

];int f[110][110

];void add(int u,int v,int w)

void dfs(int u,int rt,int

w) f[u][

1]=w;

for(int i=head[u];i;i=nxt[i])

for(int j=min(q,siz[u]);j>=0;j--)

for(int k=1;k)

f[u][j]=max(f[u][j],f[u][j-k]+f[to[i]][k]);

}int

main()

q++;

dfs(

1,0,0

); printf(

"%d\n

",f[1

][q]);

return0;

}

洛谷 P2015 二叉蘋果樹

題目描述 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1 現在這顆樹枝條太多了,需要剪枝。但是一些...

洛谷P2015 二叉蘋果樹

有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1 現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有...

洛谷P2015 二叉蘋果樹

有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋...