1074. 二叉苹果树

17 篇文章 0 订阅

在这里插入图片描述
解题报告:这道题也是树形dp题,f[i][j]代表根节点是i的情况下留j条边的最大值的方案,最后要求的是以1为根最大值为q的方案,状态转移方程就是类似于分组背包问题,先从大到小枚举体积,再枚举给子树的体积.

#include<iostream>
#include<cstring>
using namespace std;
const   int N=110;
int h[N],e[N*2],ne[N*2],idx,w[N*2];
    int n , q;
void add(int a,int b,int c)
{
    e[idx]=b , w[idx] = c , ne[idx] = h[a], h[a] = idx++;
}
int f[N][N];
void dfs(int u,int fa)
{
  //  for(int i = 1; i<= q ;i++)
//    f[u][i]=w[i];
    for(int i = h[u]; ~ i ;i = ne[i])
    {
        int jj = e[i];
        if(jj == fa)    continue;
        dfs(jj,u);
        for(int j = q ; j>=0;j--)
        for(int k=0;k<=j-1;k++)
        f[u][j]=max(f[u][j],f[u][j-k-1]+w[i]+f[jj][k]);
    }
    
}
int main()
{
    memset(h, -1,sizeof h);
    cin >> n >> q;
    for (int i = 0 ;i < n - 1 ;i ++)
    {
        int a,b,c;
        cin >> a >> b >> c;
        add( a,b, c);
        add( b, a, c);
    }
    dfs(1, -1);
    cout << f[1][q] << endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值