hdu 1011 Starship Troopers(树形dp)
2013-03-02 11:52
603 查看
1、http://acm.hdu.edu.cn/showproblem.php?pid=1011
2、题目大意:(简单树形dp,得好好看看)
你是星河战队的领导者,被送往摧毁小虫基地,这个基地被建在地下室,实际上是一个巨大的洞穴,包含许多由隧道连接的小房间。每个小房间都被一些小虫占领,而且他们的智力藏在一些房间中。你的任务就是摧毁这些小虫跟基地,尽量获得更多的智力。
现在有一张地图,每个房间有智力的可能性,洞穴的结构像一棵树,从入口只有一条路径可以到达其他房间,每经过一个房间,都要留下足够的兵来消灭小虫,而且士兵不可以走重复的房间,即每个房间只能走一次。
一个兵可以消灭20只小虫,因为没有足够的兵力,所以只能挑选几个房间进去消灭小虫,并且获得他们的智力,要求在有限的兵力情况下,获得的最大智力。
输入包括多组样例,每个样例的第一行有两个整数n,m,分别代表房间数和你拥有的兵数,接下来n行每行有两个数,分别代表房间内的小虫数和包含智力的可能性,接下来的n-1行,给出隧道的信息,即房间相连的关系,room1是洞穴的入口。样例以-1,-1 结束 输出:每个测试样例输出一行,输出用有限的兵可以得到智力的最大可能性
测试样例:
5 10
50 10
40 10
40 20
65 30
70 30
1 2
1 3
2 4
2 5
1 1
20 7
-1 -1
3、代码:
2、题目大意:(简单树形dp,得好好看看)
你是星河战队的领导者,被送往摧毁小虫基地,这个基地被建在地下室,实际上是一个巨大的洞穴,包含许多由隧道连接的小房间。每个小房间都被一些小虫占领,而且他们的智力藏在一些房间中。你的任务就是摧毁这些小虫跟基地,尽量获得更多的智力。
现在有一张地图,每个房间有智力的可能性,洞穴的结构像一棵树,从入口只有一条路径可以到达其他房间,每经过一个房间,都要留下足够的兵来消灭小虫,而且士兵不可以走重复的房间,即每个房间只能走一次。
一个兵可以消灭20只小虫,因为没有足够的兵力,所以只能挑选几个房间进去消灭小虫,并且获得他们的智力,要求在有限的兵力情况下,获得的最大智力。
输入包括多组样例,每个样例的第一行有两个整数n,m,分别代表房间数和你拥有的兵数,接下来n行每行有两个数,分别代表房间内的小虫数和包含智力的可能性,接下来的n-1行,给出隧道的信息,即房间相连的关系,room1是洞穴的入口。样例以-1,-1 结束 输出:每个测试样例输出一行,输出用有限的兵可以得到智力的最大可能性
测试样例:
5 10
50 10
40 10
40 20
65 30
70 30
1 2
1 3
2 4
2 5
1 1
20 7
-1 -1
3、代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int map[110][110]; int dp[110][110]; int w[110]; int v[110]; int visit[110]; int n,m; void dfs(int root) { visit[root]=1; int num=(w[root]+19)/20; for(int i=num; i<=m; i++) dp[root][i]=v[root]; for(int i=1; i<=map[root][0]; i++) { int u=map[root][i]; if(visit[u]==1) continue; else { dfs(u); for(int j=m; j>=num; j--) { for(int k=1; j+k<=m; k++) { if(dp[u][k]) dp[root][j+k]=max(dp[root][j+k],dp[root][j]+dp[u][k]); } } } } } int main() { int a,b; while(scanf("%d%d",&n,&m)!=EOF) { if(n==-1&&m==-1) break; memset(w,0,sizeof(w)); memset(v,0,sizeof(v)); memset(dp,0,sizeof(dp)); memset(visit,0,sizeof(visit)); memset(map,0,sizeof(map));//注意初始化 for(int i=1; i<=n; i++) { scanf("%d%d",&w[i],&v[i]); } for(int i=1; i<n; i++) { scanf("%d%d",&a,&b); map[a][0]++;//以a为根节点有多少个叶子节点 map[a][map[a][0]]=b;//以a为根节点的第几个叶子节点是b map[b][0]++; map[b][map[b][0]]=a;//双向,原理同上 } if(m==0) printf("0\n"); else { dfs(1); printf("%d\n",dp[1][m]); } } return 0; } /* 5 10 50 10 40 10 40 20 65 30 70 30 1 2 1 3 2 4 2 5 1 1 20 7 -1 -1 */
相关文章推荐
- hdu 1011 Starship Troopers 树形dp
- HDU 1011 Starship Troopers(树形DP)
- HDU 1011 树形背包(DP) Starship Troopers
- Starship Troopers(HDU 1011 树形DP)
- HDU 1011 Starship Troopers (树形DP)
- HDU 1011 Starship Troopers 树形DP(0-1背包)
- hdu 1011 Starship Troopers 树形背包dp
- hdu 1011 Starship Troopers(树形dp)
- HDU 1011 Starship Troopers (树形DP)
- hdu 1011 Starship Troopers 树形dp
- hdu 1011 Starship Troopers (树形背包dp)
- hdu 1011 Starship Troopers 简单树形DP
- HDU 1011 - Starship Troopers (树形DP)
- HDU 1011 Starship Troopers---树形dp+有依赖的背包
- hdu_1011_Starship Troopers(树形DP)
- hdu 1011 Starship Troopers(树形DP+背包问题)
- hdu_1011_Starship Troopers(树形DP)
- hdu 1011 Starship Troopers (依赖背包 树形dp)
- HDU 1011 Starship Troopers【树形DP】
- hdu 1011 Starship Troopers (树形背包dp)