16分求助,参考了第一篇题解

P2015 二叉苹果树

```cpp #include<bits/stdc++.h> using namespace std; const int N = 109; struct egde{ int to,nex,cost; } e[N << 1]; int ecnt,head[N],siz[N]; int n,q; int dp[N][N]; void addegde(int u,int v,int w){ ecnt++; e[ecnt] = (egde){v,head[u],w}; head[u] = ecnt; } void dfs(int u,int fa){ for(int i = head[u];i;i = e[i].nex){ int v = e[i].to; if(v == fa) continue; dfs(v,u); siz[u] += siz[v] + 1;//这里不是直接赋值,要加起来,因为不止一个儿子 for(int j = min(siz[u],q);j;j--) for(int k = min(siz[v],j - 1);k>=0;k--)//k可以取到0 dp[u][j] = max(dp[u][j],dp[u][j - k - 1] + dp[v][k] + e[i].cost); } } int main(){ scanf("%d%d", &n, &q); for(int i = 1;i < n;i++){ int u,v,w; scanf("%d%d%d", &u, &v, &w); addegde(u,v,w); addegde(v,u,w); } dfs(1,0); printf("%d",dp[1][q]); return 0; } ```
by iqwl @ 2023-08-16 21:06:42


|