看到这道题的第一眼我把题目看成了TLE

哦那不是重点

这道题是树形背包dp的经典例题

题目描述(大概的):

给你一棵树,每条边有一个cost,每个叶节点有一个earn

要求在earn的和大于等于cost的和的前提下问最多能连接到多少个叶节点

思路:

这道题卡了我0.5month

(因为我太懒了)

核心思路

用dp[x][k]表示x为根的子树里连接到k个叶节点时最大的利润(earn和-cost和)

那么for嵌套顺序应当是

 for(int s=cd[x];s;s--/*int d=cd[t];d;d-- <-- It is wrong*/)
             {
                 for(int d=min(cd[t],s);d;d--/*int s=cd[x];s>=d;s-- <-- It is wrong*/)
                 {
                     ){dp[x][s]=max(dp[x][s],dp[x][s-d]+dp[t][d]-e[i].v);}
                 }
             }

没错,也就是外层枚举x的体积,内层枚举t的体积,都是从大到小

至于为什么?

因为t的所有可能体积的dp你只能将其中一个装进x的dp里

听说这叫分组背包?反正我看着也差不多

此后就可以开始快乐地dfs了

(为什么看不少人都用滚动数组呢...dp[3001][3001]也不大啊)

剩下还可以加一些小小的优化

看代码吧

 #include<cstdio>
 int max(int a,int b){return a>b?a:b;}
 int min(int a,int b){return a<b?a:b;}
 struct sumireko
 {
     int to,ne,v;
 }e[];
 ],cnt;
 void addline(int f,int t,int vin)
 {
     e[++cnt].to=t;
     e[cnt].ne=he[f];
     e[cnt].v=vin;
     he[f]=cnt;
     return;
 }

 //bool v[3001];
 //写完才注意到是有向边,所以v意义不大,完全可以全部抛弃
 //但删完之后反而变慢了
 //越简化越慢也是有毒
 ];//其中cd数组与下面的findd()一起使用,用于找出每个节点的子树有几个叶节点,从而省点时间(大概)

 int findd(int x)
 {
     ;
     for(int i=he[x];i;i=e[i].ne)
     {
         int t=e[i].to;
         cd[x]+=findd(t);
     }
     return cd[x];
 }

 ][];

 void dfs(int x)
 {
     for(int i=he[x];i;i=e[i].ne)
     {
         int t=e[i].to;
         dfs(t);
         for(int s=cd[x];s;s--/*int d=cd[t];d;d-- <-- It is wrong*/)
         {
             for(int d=min(cd[t],s);d;d--/*int s=cd[x];s>=d;s-- <-- It is wrong*/)
             {
                 )dp[x][s]=max(dp[x][s],dp[x][s-d]+dp[t][d]-e[i].v);
             }
         }
     }
     return;
 }
 int main()
 {
     scanf("%d%d",&n,&m);
     ;i<=n-m;i++)
     {
         int k,tin,vin;
         scanf("%d",&k);
         ;j<=k;j++)
         {
             scanf("%d%d",&tin,&vin);
             addline(i,tin,vin);
         }
     }
     findd();
     ;i<=n;i++)
     {
         ;j<=cd[i];j++)
         {
             dp[i][j]=-;//初始化
         }
     }
     ;i<=n;i++)
     {
         scanf(]);
     }
     dfs();
     ];i>=;i--)
     {
         ][i]>=)
         {
             printf("%d",i);
             ;
         }
     }
     ;
 }

[POJ1155]TELE(树形背包dp)的更多相关文章

  1. POJ-1155 TELE 树形背包dp

    dp[u][i]代表以u为根的子树选i个叶子的最大收益 那么dp[u][i]=max(dp[u][i],dp[v][k]+dp[u][i-k]-len) (1=<k<=i) 细节看代码: ...

  2. HDU 1011 树形背包(DP) Starship Troopers

    题目链接:  HDU 1011 树形背包(DP) Starship Troopers 题意:  地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...

  3. 【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp

    题目描述 给你一棵 $n$ 层的完全二叉树,每个节点可以染黑白两种颜色.对于每个叶子节点及其某个祖先节点,如果它们均为黑色则有一个贡献值,如果均为白色则有另一个贡献值.要求黑色的叶子节点数目不超过 $ ...

  4. 【bzoj1495】[NOI2006]网络收费 暴力+树形背包dp

    题目描述 给出一个有 $2^n$ 个叶子节点的完全二叉树.每个叶子节点可以选择黑白两种颜色. 对于每个非叶子节点左子树中的叶子节点 $i$ 和右子树中的叶子节点 $j$ :如果 $i$ 和 $j$ 的 ...

  5. 【bzoj4987】Tree 树形背包dp

    题目描述 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. 输入 第一行两个正整数n,k,表示数的顶点数和需要选出的点个数. 接下 ...

  6. 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现 ...

  7. 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp

    题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...

  8. HDU1561 The more ,The better (树形背包Dp)

    ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先 ...

  9. HDU-4044 树形背包dp好题

    不会做,题解是参考网上的.感觉这道题是到好题,使得我对树形背包dp更了解了. 有几个注意的点,直接给出代码,题解以及注意点都在注释里了. #include<bits/stdc++.h> u ...

随机推荐

  1. go11---方法method

    package main /* 方法method Go 中虽没有class,但依旧有method 通过显示说明receiver来实现与某个类型的组合 只能为同一个包中的类型定义方法 Receiver ...

  2. H264 介绍[1]

    频编解码技术有两套标准,国际电联(ITU-T)的标准H.261.H.263.H.263+等:还有ISO 的MPEG标准Mpeg1.Mpeg2.Mpeg4等等.H.264/AVC是两大组织集合H.263 ...

  3. 开源框架 KJFrameForAndroid

    一个Android的快速开发工具包,使用它你可以轻松实现网络请求.插件化开发.图片加载等功能.KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化A ...

  4. 10.05FZSZ Day2模拟总结

    今天的题目难度比昨天小一些,但是太菜的我还是啥也不会. 今天的出题大佬是Heaplex,他的题目中倒是出现了ZZQ,不知道是否是本人? T1.a 期望得分30,实际得分30 这道题开场发现好像有什么小 ...

  5. dubbo作者讲编码原则

    刚看到梁飞谈到dubbo为保证代码质量开发人员必须要注意的,其实也是开发人员应该做的. 1. 防止空指针和下标越界 这是我最不喜欢看到的异常,尤其在核心框架中,我更愿看到信息详细的参数不合法异常, 这 ...

  6. 洛谷P1531 I Hate It

    题目背景 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 题目描述 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的 ...

  7. CodeForces 632C Grandma Laura and Apples (模拟)

    题意:有n个人买苹果,当苹果剩余偶数时买走一半,当苹果剩余奇数时,先买走一半,再用半价买走一个苹果,最终苹果恰好卖完.农民收入为多少. 析:反向模拟. 代码如下: #pragma comment(li ...

  8. TensorFlow---基础---GFile

    使用TensorFlow的时候经常遇到 tf.gfile.exists().... 关于gfile,一个googler是这样给出的解释: The main roles of the tf.gfile ...

  9. c语言数据读入---sscanf、fscanf

    #include <iostream> #include <cstdio> #include <cstring> #include <stdlib.h> ...

  10. C. Coin Troubles 有依赖的背包 + 完全背包变形

    http://codeforces.com/problemset/problem/283/C 一开始的时候,看着样例不懂,为什么5 * a1 + a3不行呢?也是17啊 原来是,题目要求硬币数目a3 ...