这道题先留着,等我有能力做了我再AC!!!

Starship Troopers

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4118    Accepted Submission(s): 1076

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
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
Sample Output
50 7
Author
XU, Chuan
Source
ZJCPC2004
树形DP
定义dp[i][j]默示根结点为i时,用掉j个士兵获得的最大possible。

dp[i][j] = max(dp[i][j], dp[i][j-k] + dp[son[i]][k]);

递归的求出dp[son[i]][k]的值。最后成果就是dp[1][m];

题目大意是有n个房间组成一棵树,你有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个房间里有一个代价,代价是值/20个士兵,

同时有一个价值,问你花费这m个士兵可以得到的最大价值是多少,

#include<stdio.h>
#include<iostream>
using namespace std;
const int MAXN=110;
int N,M;
struct Node
{int number,p;
};
Node node[MAXN];//记录结点
int dp[MAXN][MAXN];//DP,dp[i][j]表示跟结点为i时,用掉j个士兵获得的最大值
int adj[MAXN][MAXN];//存树
bool vis[MAXN];//访问标记 void dfs(int root)//DFS
{vis[root]=true;//已经访问 int num=(node[root].number+19)/20;//获得该结点需要的士兵数目 for(int i=num;i<=M;i++)  dp[root][i]=node[root].p;for(int i=1;i<=adj[root][0];i++){int u=adj[root][i];if(vis[u]) continue;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 b,e;while(scanf("%d%d",&N,&M)){if(N==-1&&M==-1) break;memset(vis,false,sizeof(vis));memset(dp,0,sizeof(dp));memset(adj,0,sizeof(adj));for(int i=1;i<=N;i++)scanf("%d%d",&node[i].number,&node[i].p);for(int i=1;i<N;i++)//存图
        {scanf("%d%d",&b,&e);adj[b][0]++;adj[b][adj[b][0]]=e;adj[e][0]++;adj[e][adj[e][0]]=b;}if(M==0)//这个必需要,有代价为0的房间,M=0则无法获得 printf("0\n");else{dfs(1);printf("%d\n",dp[1][M]);}    } return 0;
}

来自:http://www.cnblogs.com/kuangbin/archive/2012/03/14/2396449.html

转载于:https://www.cnblogs.com/littlehoom/p/3427994.html

Starship Troopers相关推荐

  1. HDU Starship Troopers (树形DP)

    Starship Troopers Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) ...

  2. 树形DP——HDU 1011 Starship Troopers

    HDU 1011 Starship Troopers 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1011 作为星河战队的领导者,你被派去摧毁这些虫子的基 ...

  3. HDU1011 Starship Troopers(树形dp)

    题意: 有n个房间组成一棵树,你有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个房间里有一个代价,代价是值/20个士兵, 同时有一个价值,问你花费这m个士兵可以得到的最大价值是多少, 思路: d ...

  4. HDU 1011 Starship Troopers 树形+背包dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1011   题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被 ...

  5. Starship Troopers(HDU 1011 树形DP)

    题意: 给定n个定点和m个士兵,n个定点最终构成一棵树,每个定点有一定x个bugs和y个value,每20个bug需要消耗一个士兵,不足20也消耗一个,然后最终收获y个value,只有父节点被占领后子 ...

  6. hdu 1011 Starship Troopers (树形背包dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接 : hdu-1011 题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节 ...

  7. HDU 1011 Starship Troopers星河战队(树形dp)

    题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1. 每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子. 现 ...

  8. 动态规划 —— 树形 DP

    [概述] 树形动态规划是在树的数据结构上的动态规划,在各个阶段呈现树状关系的时候可以采用树形 DP,其基本思想是由子节点的信息推出父节点的信息. 树形 DP 中,是通过以下 4 点树的特点来进行建图的 ...

  9. [转]使用Python MrJob的MapReduce实现电影推荐系统

    [原文]:http://www.sobuhu.com/archives/567 最近发现一个很好玩的Python库,可以方便的使用在Python下编写MapReduce任务,直接使用Hadoop St ...

  10. 杭电OJ分类题目(3)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(3) HDU Computational Ge ...

最新文章

  1. LeetCode简单题之重塑矩阵
  2. LVM逻辑卷管理测试——创建逻辑卷
  3. netstat获取本机监听的地址列表 —— *链表实现*(sudo netstat -nl | grep -w tcp | awk '{print $4}')
  4. java 正则表达式提取价格
  5. 恢复xfs文件系统superblock实验
  6. 网曝 Solaris 系统被砍,开发团队将大半被解雇
  7. 数据结构学习之路-第一章:绪论
  8. 实作 ASP.NET 多笔数据离线编辑
  9. 按比例设置获奖人数方案
  10. 【米课】思维导图与深度思考
  11. 读取jar包所在目录和jar包内文件
  12. ASP编程入门进阶(七):内置对象Server
  13. 视频网站程序 linux,观看主流视频平台视频的Windows、Mac、Linux客户端:ivideo
  14. statcounter统计的浏览器市场占有率
  15. TRACE32——List源代码查看
  16. 《人工智能导论》自然演绎推理
  17. Snapchat面经
  18. 简单实现一下百度地图
  19. 小程序如期而至,赶快看看有哪些好玩的小程序吧
  20. 基于SpringBoot+thymeleaf+Mysql实现的资产管理系统

热门文章

  1. ConnectionString 最简便写法 for MSSQL 2005 EXPRESS
  2. idea 运行jmeter源码_JMeter知识系列(2)JMeter连接MongoDB
  3. Android 多媒体开发学习之加载大图片
  4. 红黑树(Red Black Tree)
  5. 绘制Linux/Android设备的内存动态变化趋势图
  6. Linux SWAP 深度解读
  7. html模拟手机桌面,html+css+js 模拟win7桌面
  8. python函数第二次运行报错_(数据科学学习手札54)Python中retry的简单用法
  9. 树算法系列之一:CART回归树
  10. 栈和排序---牛客练习赛10--B题