HDU 1011 Starship Troopers(星河战队)题解
文章目录
HDU 1011 Starship Troopers(星河战队)题解
题目来源:HDU http://acm.hdu.edu.cn/showproblem.php?pid=1011
算法类型:树形DP / 树形背包
通过率:Total Submission(s): 6816 Accepted Submission(s): 1845
题目信息
Time Limit: 10000/5000 MS (Java/Others)
Memory Limit: 65536/32768 K (Java/Others)
Problem Description
You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built underground. It is actually a huge cavern, which consists of many rooms connected with tunnels. Each room is occupied by some bugs, and their brains hide in some of the rooms. Scientists have just developed a new weapon and want to experiment it on some brains. Your task is to destroy the whole base, and capture as many brains as possible.
To kill all the bugs is always easier than to capture their brains. A map is drawn for you, with all the rooms marked by the amount of bugs inside, and the possibility of containing a brain. The cavern’s structure is like a tree in such a way that there is one unique path leading to each room from the entrance. To finish the battle as soon as possible, you do not want to wait for the troopers to clear a room before advancing to the next one, instead you have to leave some troopers at each room passed to fight all the bugs inside. The troopers never re-enter a room where they have visited before.
A starship trooper can fight against 20 bugs. Since you do not have enough troopers, you can only take some of the rooms and let the nerve gas do the rest of the job. At the mean time, you should maximize the possibility of capturing a brain. To simplify the problem, just maximize the sum of all the possibilities of containing brains for the taken rooms. Making such a plan is a difficult job. You need the help of a computer.
Input
The input contains several test cases. The first line of each test case contains two integers N (0 < N <= 100) and M (0 <= M <= 100), which are the number of rooms in the cavern and the number of starship troopers you have, respectively. The following N lines give the description of the rooms. Each line contains two non-negative integers – the amount of bugs inside and the possibility of containing a brain, respectively. The next N - 1 lines give the description of tunnels. Each tunnel is described by two integers, which are the indices of the two rooms it connects. Rooms are numbered from 1 and room 1 is the entrance to the cavern.
The last test case is followed by two -1’s.
Output
For each test case, print on a single line the maximum sum of all the possibilities of containing brains for the taken rooms.
Sample Input
1 | 5 10 |
Sample Output
1 | 50 |
中文题意描述
你作为星河战队的队长,被派去消灭地下臭虫基地。基地由若干房间和通道组成,整体为树形结构,每个房间有且仅有一条通往入口(1号房间)的路径。
每个房间存在一定数量的臭虫,以及对应的大脑虫价值。每1名士兵可以消灭20只臭虫,攻占房间需要消耗对应数量的士兵。行进规则为:经过房间必须留守士兵清剿,士兵不会重复访问房间。
士兵数量有限,无法攻占所有房间,需要合理选择攻占房间,最大化获取的大脑虫总价值。
解题思路
房间构成树形结构,访问子节点必须经过父节点,属于树形依赖背包问题;
每个房间所需士兵数:
bug数量 / 20,向上取整;通过深度优先搜索遍历所有可行路径,枚举所有合法房间组合,计算士兵消耗与最大价值;
回溯遍历所有树形分支,剔除士兵不足的方案,保留最优解。
AC代码(Java)
1 | import java.util.ArrayList; |
代码说明
Cavern 内部类:存储每个房间的虫子数量、大脑价值、所需士兵、邻接节点及访问状态;
getMax() 递归回溯:深度优先遍历整棵树,枚举所有可行访问路径;
getResult() 价值计算:校验当前路径士兵是否充足,不足则剔除节点递归求解最优解;
4.树形建图:采用双向邻接表存储,遍历过程中通过访问状态去重,避免回路。
版权声明:本文为原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。