1 条题解

  • 0
    @ 2025-2-14 21:20:42

    C :

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int n, q;
    struct ben {
    int to, last, val, dq;
    }a[205];
    int f[205][205];
    int cnt = 1;
    int head[205];
    
    void add(int x, int y, int num) {
    a[cnt].to = y;
    a[cnt].last = head[x];
    a[cnt].dq = x;
    a[cnt].val = num;
    head[x]=cnt++;
    }
    
    void search(int dq, int fa) {
    for(int i = head[dq];i >0; i = a[i].last) {
        int b = a[i].to;
        if(b == fa)continue;
        f[b][1]=a[i].val;
        search(b,dq);
        for(int j = q;j >= 1; j--) {
            for(int k = 0;k <= j; k++) {
                if((j != 1 && j != k) || dq == 1) {
                    f[dq][j] = fmax(f[dq][j],f[b][k]+f[dq][j-k]);
                }
            }
        }
    }
    }
    int main()
    {
        scanf("%d%d",&n,&q);
        for(int i = 1;i <= n; i++) {
            head[i]=-1;
        }
        for(int i = 1;i < n; i++) {
            int x, y, num;
            scanf("%d%d%d",&x,&y,&num);
            add(x,y,num);
            add(y,x,num);
        }
        search(1,0);
        printf("%d\n",f[1][q]);
        return 0;
    }
    

    C++ :

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    struct tree
    {
    	int lc,rc,data;
    };
    const int maxn=101;
    int n,q,a[maxn][maxn],f[maxn][maxn];
    bool flag[maxn]={0};
    tree t[maxn];
    void init();
    void buildtree(int);
    int dp(int,int);
    int main()
    {
    	//freopen("apple11.in","r",stdin);
    	init();
    	buildtree(1);
    	cout<<dp(1,q)<<endl;
    	return 0;
    }
    void init()
    {
    	cin>>n>>q;
    	q++;//q条树枝需要q+1个点 
    	memset(t,0,sizeof(t));
    	memset(a,-1,sizeof(a));//有些树枝可能没有苹果 
    	memset(f,-1,sizeof(f));//
    	memset(flag,0,sizeof(flag));
    	for(int i=1;i<n;i++)
    	{
    		int x,y,z;
    		cin>>x>>y>>z;
    		a[x][y]=a[y][x]=z;
    	}
    }
    void buildtree(int x)
    {
    	flag[x]=true;//当前点进树 
    	for(int i=1;i<=n;i++) 
    	{
    		if(!flag[i] && a[x][i]!=-1)//找和x点直接相连且不在树上的点
    		{
    			if(t[x].lc==0) t[x].lc=i;//如果x没有坐子树,则i为其左儿子 
    			else t[x].rc=i;//如果有左儿子则为其右儿子,因为和x相连的点只有2个或者没有 
    			t[i].data=a[x][i];//i点的值域记录的是i到其父亲节点的苹果数 
    			buildtree(i);//对i点递归建树 
    		}
    	}
    }
    int dp(int x,int y)//表示以下x为根,保留y个节点 
    {
    	if(f[x][y]!=-1)return f[x][y];//如果f[x][y]有值则不用再计算 
    	if(x==0||y==0)
    	{
    		f[x][y]=0;//x=0表示该节点没有子树,是叶节点,y=0表示没有节点 
    		return f[x][y];
    	}
    	f[x][y]=0;
    	for(int i=0;i<=y-1;i++)
    	{
    		int ls=dp(t[x].lc,i);//x的左儿子为根,保留i个节点 
    		int rs=dp(t[x].rc,y-1-i);//x的右儿子为根,保留y-1-i个节点,因为x节点必须保留,所以y-1 
    		if(f[x][y]<ls+rs)
    			f[x][y]=ls+rs;
    	} 
    	f[x][y]+=t[x].data;
    	return f[x][y];
    }
    

    Pascal :

    var lc,rc:array[-1..101] of longint;
        vis:array[0..101] of boolean;
        f,d:array[-10..101,-10..101] of longint;
        v:array[-1..101,0..3] of longint;
        ap:array[-1..101] of longint;
        n,q,i,a,b,c:longint;
    
    procedure treedp(x,tot:longint);
      var ans,i:longint;
        begin
          if f[x,tot]>-1 then exit;
          if x=-1 then
            begin
              f[x,tot]:=0;
              exit;
            end;
          if tot=0 then
            begin
              f[x,tot]:=0;
              exit;
            end;
          ans:=0;
            for i:=0 to tot-1 do
              begin
                treedp(lc[x],i);
                treedp(rc[x],tot-i-1);
                if f[lc[x],i]+f[rc[x],tot-i-1]+ap[x]>ans then
                  ans:=f[lc[x],i]+f[rc[x],tot-i-1]+ap[x];
              end;
          f[x,tot]:=ans;
        end;
    
    
    procedure build(x:longint);
      var i:longint;
        begin
          vis[x]:=true;
          for i:=1 to v[x,0] do
            if not vis[v[x,i]] then
             if lc[x]=-1 then
              begin
                lc[x]:=v[x,i];
                ap[lc[x]]:=d[x,lc[x]];
                build(lc[x]);
              end
             else
              begin
                rc[x]:=v[x,i];
                ap[rc[x]]:=d[x,rc[x]];
                build(rc[x]);
              end;
        end;
    
    
      begin
        readln(n,q);
        for i:=1 to n-1 do
          begin
            readln(a,b,c);
            inc(v[a,0]);
            v[a,v[a,0]]:=b;
            inc(v[b,0]);
            v[b,v[b,0]]:=a;
            d[a,b]:=c;
            d[b,a]:=c;
          end;
        fillchar(lc,sizeof(lc),255);
        fillchar(rc,sizeof(rc),255);
        fillchar(f,sizeof(f),255);
        fillchar(vis,sizeof(vis),false);
        build(1);
        treedp(1,q+1);
        writeln(f[1,q+1]);
      end.
    
    
    
    • 1

    信息

    ID
    840
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者