链接
题意
有一棵苹果树,若树枝分叉,则一定分2叉,即没有只有一个子节点的节点,这棵树共\(n\)个节点,编号为1-\(n\),树根为1。我们用一根树枝两端连接的节点的编号表示一根树枝的位置,下面是一个有四个树枝的树; 现在它的枝条太多了,需要剪枝,但是每个树枝上都长有一些苹果,给定需要保留的树枝数量,求最多能留住多少苹果。1
2
3
4
52 5
\ /
3 4
\ /
1
输入格式:第一行两个整数\(n,q\),\(n\)表示树的节点数,\(q\)表示需要保留的树枝数量,接下来\(n-1\)行描述树枝的信息,每行三个数,前两个是它连接的结点,第三个是这跟树枝上苹果的数量,每根树枝上的苹果不超过30000个。
数据范围:\(1\leq q\leq n,1< n\leq 100\).
输出格式:输出一行,最多能留住的苹果的个数。
分析
这是一个树形背包的经典入门题。
设\(dp[x][t]\)表示在以\(x\)为根的子树中选取\(t\)个树枝,能获得的最多的苹果,\(x\)有两个子节点,如果沿一个子节点\(a\)中选了\(k\)个树枝(\(k\)个包括\(x\)与\(a\)之间的这个树枝),那么另沿着一个子节点\(b\)则一定选了\(t-k-1\)个树枝(不包括\(b\)与\(x\)之间的这个树枝),则动态转移方程为: \[f[u][i]=\max_{0\leq j \leq i}(f[u][i],f[u][i−j−1]+f[v][j]+a[u][v])\]
细节见程序。
代码
1 |
|