题目大意:给一棵带边权的有根树,每个叶子节点有权。边权表示代价,叶子节点的权值代表可以补偿多少代价。问从根节点最多可以到达多少个叶子,使得付出的总代价不大于0。

题目分析:定义状态dp(u,k)表示从u开始到达k个叶子所花费的最小代价。则状态转移方程为:

dp(u,k)=min(dp(u,k),dp(son,j)+dp(u,k-j)+u到son的代价)。

ps:要加上优化,否则超时。

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std; const int N=3005;
const int INF=1000000000; struct Edge
{
int to,w,nxt;
};
Edge e[N];
int n,m,cnt;
int w[N];
int head[N];
int dp[N][N]; void add(int u,int v,int w)
{
e[cnt].to=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt++;
} void init()
{
int k,a,b;
cnt=0;
memset(head,-1,sizeof(head));
for(int i=1;i<=n-m;++i){
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&a,&b);
add(i,a,b);
}
}
for(int i=n-m+1;i<=n;++i)
scanf("%d",w+i-n+m-1);
} int dfs(int u)
{
for(int i=0;i<=m;++i)
dp[u][i]=INF;
dp[u][0]=0;
if(u>n-m){
dp[u][1]=-w[u-n+m-1];
return 1;
}
int tot=0;
for(int i=head[u];i!=-1;i=e[i].nxt){
int v=e[i].to;
tot+=dfs(v);
for(int j=tot;j>=1;--j)
for(int k=0;k<=j;++k)
dp[u][j]=min(dp[u][j],e[i].w+dp[v][k]+dp[u][j-k]);
}
return tot;
} void solve()
{
dfs(1);
int ans=0;
for(int i=m;i>=0;--i){
if(dp[1][i]<=0){
ans=i;
break;
}
}
printf("%d\n",ans);
} int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
solve();
}
return 0;
}

  

POJ-1155 TELE (树形DP+分组背包)的更多相关文章

  1. [POJ 1155] TELE (树形dp)

    题目链接:http://poj.org/problem?id=1155 题目大意:电视台要广播电视节目,要经过中转机构,到观众.从电视台到中转商到观众是一个树形结构,经过一条边需要支付成本.现在给你每 ...

  2. HDU4003Find Metal Mineral[树形DP 分组背包]

    Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Other ...

  3. HDU-1011 Starship Troopers (树形DP+分组背包)

    题目大意:给一棵有根带点权树,并且给出容量.求在不超过容量下的最大权值.前提是选完父节点才能选子节点. 题目分析:树上的分组背包. ps:特判m为0时的情况. 代码如下: # include<i ...

  4. Ural-1018 Binary Apple Tree(树形dp+分组背包)

    #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #i ...

  5. hdu 1561 树形dp+分组背包

    题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值. 一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m) ...

  6. 【P2015】二叉苹果树 (树形DP分组背包)

    题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 现在这颗树枝条太多了,需要剪枝.但是 ...

  7. poj2486 Apple Tree (树形dp+分组背包)

    题目链接:https://vjudge.net/problem/POJ-2486 题意:一棵点权树,起点在1,求最多经过m条边的最大点权和. 思路: 树形dp经典题.用3维状态,dp[u][j][0/ ...

  8. hdu1561 The more, The Better 树形DP+分组背包

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路: 典型的树形背包题目: 定义dp[i][j]表示以i为根节点,攻打j个城堡的获得的财宝的最 ...

  9. POJ 1947Rebuilding Roads(树形DP + 01背包)

    题目链接 题意:给出一个树形结构,求P个节点的子树最少要去掉几条边 分析:DP[root][j] 表示 以第 root 个为根节点, 包含j 个节点需要去掉几条边.那么对于 root 这个根节点来说, ...

随机推荐

  1. maven的简单安装与配置

    什么是Maven? Maven可以被理解成"知识的积累",也可以被翻译为"专家".它是一个项目管理工具. 它的主要服务即源于java平台的项目构建.依赖管理和项 ...

  2. hadoop生态系统的详细介绍

    1.Hadoop生态系统概况 Hadoop是一个能够对大量数据进行分布式处理的软件框架.具有可靠.高效.可伸缩的特点. Hadoop的核心是HDFS和MapReduce,hadoop2.0还包括YAR ...

  3. 解决mac eclipse 异常退出后无法打开处于loading状态

    <workspace>\.metadata\.plugins\org.eclipse.core.resources目录,删除文件 .snap

  4. Virtual Friend Function

    一般而言,友元作为一种紧耦合的设计,被视作类的一部分.一个经典的应用就是关于类的序列化和反序列化. class A { friend ostream& operator<<(ost ...

  5. N的阶乘的长度

    阶乘是乘法 , 乘法的话 , 几位数*几位数的位数 就是 哪两个几位数相加 .  这个可以用log10来解决 , 所以有如下代码 . #include<stdio.h> #include& ...

  6. 【LeetCode OJ】Interleaving String

    Problem Link: http://oj.leetcode.com/problems/interleaving-string/ Given s1, s2, s3, find whether s3 ...

  7. VIM_插件

    VIM进阶:插件     通过一段时间的练习,你就可以非常熟练的使用VIM.即使是"裸奔",VIM已经足够强大,能够完成日常的绝大部分工作.     但VIM更加强大的是它的扩展机 ...

  8. iOS System Services

    System Services is a singleton class to gather all available information about a device. Over 75 met ...

  9. 使用java理解程序逻辑,变量

    数据类型 说明 举例 int 整型 用于存储整数.例如.学员人数.某公司的员工编号.一年的天数.一天的小时数 double 双精度浮点型 用于存储带有小数的数字.例如商品的价格.世界的价格.世界银行给 ...

  10. 【转】What is an entity system framework for game development?

    What is an entity system framework for game development? Posted on 19 January 2012 Last week I relea ...