1 条题解

  • 0
    @ 2025-11-12 20:26:35
    // 树上背包 O(9000*600)
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    const int N=10005;
    int head[N],idx;
    struct E{int v,t,w,ne;}e[N];
    void add(int u,int v,int t,int w){
      e[++idx]={v,t,w,head[u]};
      head[u]=idx;
    }
    int n,tot,ans,f[N][N],sz[N];
    
    void build(int u,int fa){
      int t,x,w,c;
      scanf("%d%d",&t,&x);
      add(fa,u,t*2,0);
      if(!x){
        build(++tot,u);
        build(++tot,u);
      }
      else
        while(x--){
          scanf("%d%d",&w,&c);
          add(u,0,c,w);
        }
    }
    void dfs(int u){
      for(int i=head[u];i;i=e[i].ne){
        int v=e[i].v,t=e[i].t;
        if(v==0) f[0][0]=e[i].w;
        dfs(v);
        sz[u]+=sz[v]+t;
        for(int j=min(n,sz[u]);j>=t;j--)
          for(int k=0;k<=min(j-t,sz[v]);k++)
            f[u][j]=max(f[u][j],f[u][j-k-t]+f[v][k]);
      }
    }
    int main(){
      scanf("%d",&n),n--;
      tot=1;
      build(++tot,1);
      dfs(1);
      printf("%d\n",f[1][n]);
    }
    
    • 1

    信息

    ID
    1446
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    76
    已通过
    25
    上传者