hdu 1011 Starship Troopers_树状dp
题意:给你一棵树(必须从根节点出发),每个节点上都有bug和value,你有m个骑士,每个骑士能消灭20个bug,你必须消灭该节点的全部bug才能拿到该节点的value,问最多能拿到value是多少.
思路:典型的背包dp , dp[n][m]=max(dp[n][m-x]+value,dp[n][m])
#include<iostream>
#include<cstdio>
using namespace std;
#define N 110
#define INF 999999999
struct node
{
int v,next;
}edge[N<<1];
int adj[N],vis[N],room[N][2],dp[N][N],edgeNum;
int max(int a,int b){return a>b?a:b;}
void AddEdge(int u,int v)
{
edge[edgeNum].v=v,edge[edgeNum].next=adj[u],adj[u]=edgeNum++;
edge[edgeNum].v=u,edge[edgeNum].next=adj[v],adj[v]=edgeNum++;
}
void init()
{
memset(vis,0,sizeof(vis));
memset(adj,-1,sizeof(adj));
memset(dp,0,sizeof(dp));
edgeNum=0;
}
void dfs(int u,int m)
{
int num=room[u][0]/20,i,j,k;
if(room[u][0]%20)//bug多于二十的倍数当然要多一个骑士消灭bug
num++;
vis[u]=1;
for(i=num;i<=m;i++)
dp[u][i]=room[u][1];//加上该节点的价值
for(i=adj[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(!vis[v])
{
dfs(v,m);
for(j=m;j>=num;j--)
{
for(k=1;j+k<=m;k++)
if(dp[v][k])
dp[u][k+j]=max(dp[u][k+j],dp[u][j]+dp[v][k]);//背包求最优价值
}
}
} }
int main()
{
int n,m;
int i,u,v;
while(scanf("%d%d",&n,&m))
{
if(n==-1&&m==-1)
break;
init();
for(i=1;i<=n;i++)
scanf("%d%d",&room[i][0],&room[i][1]);
for(i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
AddEdge(u,v);//单向
}
if(m==0)//没有骑士
{
printf("0\n");
continue;
}
dfs(1,m);//必须从节点1开始
printf("%d\n",dp[1][m]); }
return 0;
}
hdu 1011 Starship Troopers_树状dp的更多相关文章
- HDU 4714 Tree2cycle(树状DP)(2013 ACM/ICPC Asia Regional Online ―― Warmup)
Description A tree with N nodes and N-1 edges is given. To connect or disconnect one edge, we need 1 ...
- HDU 1011 Starship Troopers (树dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意: 题目大意是有n个房间组成一棵树,你有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个 ...
- HDU 1011 Starship Troopers 树形+背包dp
http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被 ...
- HDU 1011 Starship Troopers【树形DP/有依赖的01背包】
You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ...
- hdu 1011 Starship Troopers 树形背包dp
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 1011(Starship Troopers,树形dp)
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 1561 The more, The Better_树状dp
题目链接 题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小. 思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+d ...
- 树状DP HDU1520 Anniversary party
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:职员之间有上下级关系,每个职员有自己的happy值,越高在派对上就越能炒热气氛.但是必须是 ...
- 树状DP (poj 2342)
题目:Anniversary party 题意:给出N各节点的快乐指数,以及父子关系,求最大快乐指数和(没人职员愿意跟直接上司一起玩): 思路:从底向上的树状DP: 第一种情况:第i个员工不参与,F[ ...
随机推荐
- 查看syslog-ng内存,兼容容器情况
syslog_pid=`ps -ef|grep syslog-ng|grep -v grep |awk '{print $2}'` pid_count=`ps -ef|grep syslog-ng|g ...
- 初识前端HTML
HTML 超文本标记语言 HTML的解析 顾名思义,HTML就是由一个个的标签组成的,组成后,HTML可被浏览器直接识别以及处理成我们想给用户展示的样子. 下面我们就来解析HTML的一个个标签. &l ...
- Asp.Net HttpApplication 事件汇总
Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序安全性以及其它一些任务.下面让我们详细看 ...
- 数据库分库分表(sharding)系列(一)拆分实施策略和示例演示
本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...
- 使用NSURLCache为NSURLRequest设置缓存
http://m.blog.csdn.net/blog/u011439689/18734363#
- SQL 经典练习
SQL 基础练习 CREATE TABLE STUDENT(SNO VARCHAR(3) NOT NULL, SNAME VARCHAR(4) NOT NULL,SSEX VARCHAR(2) NOT ...
- OpenCV——手势识别
使用ANN神经网络训练数据后进行手势识别. #include "header.h" int main() { ; //训练每类图片数量 ; //训练类数3:石头剪刀布 ; ; st ...
- linux修改密码
情景:Linux 服务器上用户的密码被服务器管理员发现太过简单,需要重置密码.处理时为了方便记忆,就直接使用普通用户登录,修改密码时,在原密码的基础上增加一串特定的数字,结果提示不通过.例如出现错误提 ...
- php array_combine 把array的默认键改成指定的字符串
array(2) { [0] => array(6) { [0] => string(1) "1" [1] => string(10) "1470650 ...
- python Tips(不定期更新)
dictionary sort 1.根据key排序,正向排序 sorted(dic.items(), key=lambda d: d[0]) 2.根据value排序,反向排序 sorted(dic.i ...