题目链接:https://vjudge.net/problem/HDU-4276

题意:给出一棵树,起点为1,时间为V,终点为n,每个点有一个价值a[u],每条边有一个时间花费w,求在时间V内到达终点n可以获得的最大价值。

思路:

  考虑边有两种情况,一种是属于1->n路径上的(只用走一次),一种是不属于该路径上的(需要走两次),为了统一,不妨把V减去1-n路径上的权值和,然后把1->n路径上边的权值置为0。

  此时就转换为求在起点1,在时间V内回到起点的最大价值。用dp[u][j]表示在点u有时间j,最后回到点u的最大价值,dp[u][j]初始化为a[u](0<=j<=V),转移方程为:
    dp[u][j]=max(dp[u][j],dp[u][j-tmp-k]+dp[v][k]。

  其中v为u的子结点,tmp=2×w(u,v)。

AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; int n,V,a[],e[][],dp1[],dp2[][]; void dfs1(int u,int fa){
dp1[u]=-;
if(u==n) dp1[u]=;
for(int i=;i<=n;++i)
if(e[u][i]!=-){
if(i==fa) continue;
dfs1(i,u);
if(dp1[i]!=-){
dp1[u]=dp1[i]+e[u][i];
e[u][i]=e[i][u]=;
}
}
} void dfs2(int u,int fa){
for(int j=;j<=V;++j)
dp2[u][j]=a[u];
for(int i=;i<=n;++i)
if(e[u][i]!=-){
if(i==fa) continue;
dfs2(i,u);
int tmp=*e[u][i];
for(int j=V;j>=tmp;--j)
for(int k=;k<=j-tmp;++k)
dp2[u][j]=max(dp2[u][j],dp2[u][j-tmp-k]+dp2[i][k]);
}
} int main(){
while(~scanf("%d%d",&n,&V)){
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
e[i][j]=-;
for(int i=;i<n;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
e[u][v]=e[v][u]=w;
}
for(int i=;i<=n;++i)
scanf("%d",&a[i]);
dfs1(,);
if(V<dp1[]){
printf("Human beings die in pursuit of wealth, and birds die in pursuit of food!\n");
continue;
}
V-=dp1[];
dfs2(,);
printf("%d\n",dp2[][V]);
}
return ;
}

hdoj4276(树形dp+分组背包)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. hdu 4003 树形dp+分组背包 2011大连赛区网络赛C

    题意:求K个机器人从同一点出发,遍历所有点所需的最小花费 链接:点我 Sample Input 3 1 1 //3个点,从1出发,1个机器人 1 2 1 1 3 1 3 1 2 1 2 1 1 3 1 ...

  9. HDU-4003 Find Metal Mineral (树形DP+分组背包)

    题目大意:用m个机器人去遍历有n个节点的有根树,边权代表一个机器人通过这条边的代价,求最小代价. 题目分析:定义状态dp(root,k)表示最终遍历完成后以root为根节点的子树中有k个机器人时产生的 ...

随机推荐

  1. GO111MODULE的设置(及GOPROXY)

    环境:win7  go1.13.1 早听说GO111MODULE大名,今天才测试成功,步骤如下: 因为我的Go version >= 1.13,直接用go env -w 设置(注意大小写) go ...

  2. iOS Jenkins 自动化打包构建

    前言 在测试app项目过程中,通常都是需要开发打测试包给到测试,但是无论是iOS还是Android的打包过程都是相当漫长的,频繁的回归测试需要频繁的打包,对于开发同学影响还是蛮大的.因此在这种情况下, ...

  3. ListCtrl 技巧集

    1. ListCtrl 风格       LVS_ICON: 为每个item显示大图标       LVS_SMALLICON: 为每个item显示小图标       LVS_LIST: 显示一列带有 ...

  4. ThreadGroupAPI

    官方解释 public class ThreadGroup extends Object implements Thread.UncaughtExceptionHandler A thread gro ...

  5. Maven依赖传递

    依赖传递原则: 1.路径最短原则 2.路径相同是先申明者优先(dependency申明顺序先的优先)

  6. vue props传值后watch事件未触发的问题

    父组件传值,子组件监听,明明很简单的一个事情,硬是卡了许久(毕竟不是专业搞前端的,还是吃亏在学识浅陋).也和自己钻牛角尖有关,想自己解决问题. 早期我写过一篇vue组件传值的文章,传值方式是这样的: ...

  7. nginx配置不当引起的错误

    1.CRLF注入 1.1环境配置 apt install nginx vi /etc/nginx/sites-available/default location / { return 302 htt ...

  8. 重读APUE(8)-进程、进程组、会话

    进程: 是系统中一段程序执行的实体,也是资源分配和调度的基本单位: 进程组: 为了方便管理多个进程,可以将多个进程加入到一个进程组内: 每个进程都属于一个进程组,但是同一个进程组内可以有多个进程: 每 ...

  9. Razor字符串处理

    需要注意的是低版本是不支持C# 6语法中的string interpolation的 <label> @if (!string.IsNullOrEmpty(Model.BudgetValu ...

  10. pip 安装的问题

    安装 pip install   mysql-python 报错: mysql_config: command not found 解决办法: yum install mysql-devel yum ...