B - Binary Apple Tree URAL - 树形DP+背包

  • B - Binary Apple Tree

  •  URAL - 1018 
  • 这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果
  • dp[i][j]来表示第i个节点保留j个树枝的最大苹果数。树形dp搜索父子关系,以树枝数为容量dp存的为苹果数进行背包dp即可
  • #include
    #include
    #include
    using namespace std;
    #define maxn 150
    int head[maxn],tot;
    int dp[maxn][maxn];
    int Size[maxn],n,m;
    struct node
    {
        int to,v,val;
    } edge[maxn*maxn*10];
    void add(int u,int v,int w)
    {
        edge[++tot].v=v;
        edge[tot].to=head[u];
        edge[tot].val=w;
        head[u]=tot;
        edge[++tot].v=u;
        edge[tot].to=head[v];
        edge[tot].val=w;
        head[v]=tot;
    }
    void dfs(int u,int pre)
    {
        Size[u]=1;
        for(int i=head[u]; i!=-1; i=edge[i].to)
        {
            int v=edge[i].v;
            if(v==pre)continue;
            dfs(v,u);
            Size[u]+=Size[v];
            for(int j=Size[u]; j>1; j--)
                for(int k=1; k

     

你可能感兴趣的:(DP)