树形背包

 

 一棵树,每个节点都有权值,问必须包含根节点的权值和最大的联通块,联通快大小为k,求权值和 

 

复制代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 2510
#define eps 0.00001
using namespace std;
int K,n,m,head[maxn],num,sz[maxn];
double w[maxn],f[maxn][maxn];
struct node{int to,pre;}e[maxn*2];
void Insert(int from,int to){
    e[++num].to=to;
    e[num].pre=head[from];
    head[from]=num;
}
void dfs(int x){
    sz[x]=1;
    for(int i=head[x];i;i=e[i].pre){
        int to=e[i].to;
        dfs(to);
        sz[x]+=sz[to];
    }
}
void dp(int x){
    int tot;
    f[x][1]=w[x],tot=1;
    for(int i=head[x];i;i=e[i].pre){
        int to=e[i].to;
        dp(to);
        tot+=sz[to];
        for(int j=tot;j>=0;j--)
            for(int k=min(sz[to],j);k>=0;k--)
                f[x][j]=max(f[x][j],f[x][j-k]+f[to][k]);
    }
}
int main(){
    scanf("%d",&n);
    int x,y;
    for(int i=1;i<=n;i++)scanf("%lf",&w[i]);
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        Insert(x,y);
    }
    dfs(1);
    memset(f,0xc2,sizeof(f));
    dp(1);
    printf("%lf",f[1][2]);
    return 0;
}
复制代码

 

posted @   Echo宝贝儿  阅读(155)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!
点击右上角即可分享
微信分享提示