【树形DP+背包】 hdu1011 Starship Troopers

杭电ACM OJ 1011 Starship Troopers 树的动态规划(树的dp)经典树形背包 java写的 包看懂 递归流程完全解析 Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20646    Accepted Submission(s): 5497 Problem Description You, t 阅读详情

Starship Troopers

http://acm.hdu.edu.cn/showproblem.php?pid=1011


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


题意:n个洞穴,m个士兵,每个洞中有a个bug,b个brain,每个士兵可以处理20个bug,入口在洞穴1处,问最多可以得到多少个brain。 

题解:树形DP+背包。dp[x][j]=max{dp[x][j-k]+dp[i][k]},其中x与i相连。


//树形DP+背包
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 105
#define max(a,b) ((a)>(b)?(a):(b))
int dp[MAX][MAX];//在第i个洞穴有j个人时获得的最大值
int mapt[MAX][MAX];
int n,m;
struct node
{
    int brain,bug;
}room[MAX];
void dfs(int x,int pre)
{
    int r=(room[x].bug+19)/20;//第x个洞需要的人数
    for(int i=m;i>=r;--i)
        dp[x][i]=room[x].brain;//初始化
    for(int i=1;i<=n;++i)
    {
        if((mapt[x][i])&&(pre!=i))
        {
            dfs(i,x);
            for(int j=m;j>=r;--j)
                for(int k=1;k<=j-r;++k)
                    dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[i][k]);
        }
    }

}
int main()
{
    int a,b;
    for(;scanf("%d%d",&n,&m);)
    {
        if(n==-1&&m==-1) break;
        for(int i=1;i<=n;++i)
            scanf("%d%d",&room[i].bug,&room[i].brain);
        memset(mapt,0,sizeof(mapt));
        memset(dp,0,sizeof(dp));
        for(int i=1;i<n;++i)
        {
            scanf("%d%d",&a,&b);
            mapt[a][b]=mapt[b][a]=1;
        }
        if(m==0)
        {
            puts("0");
            continue;
        }
        dfs(1,-1);
        printf("%d\n",dp[1][m]);
    }
    return 0;
}
来源: http://blog.youkuaiyun.com/ACM_Ted

SAP公司间外协业务流程以及配置说明 阅读详情

相关推荐

树莓派小车:智能捡球小车——Q宝

在遇到第一个直角右转口后,进入阶段二,阶段二是智能小车减速,因为速度过快可能导致车头下方的检测出现小毛病,小车进入第一个左拐路口,增加左转时间,然后直行,到横线处,小车停止,进入阶段三,小车先识别前方的球类,然后倒车到拐口处,原地右转,之后的识别也是类似的操作,随后有一个简单的避障功能,进行球类识别测试时,在本地测试效果良好,但是投入实际应用中时,受到光线等因素的影响,识别球类的能力大大下降。小车摄像头精度不够,视角较小,在识别人脸时,需要不断移动人脸照片,让摄像头能够抓取人脸。在第一阶段的循迹过程中,

dfbsszxzv的博客 1932

hdoj1011

Starship Troopers 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 o

◆◇丶生如夏花。谁来订阅我的悲伤 767

如何在软件复位后保留指定RAM区域的数据

本文主要介绍S32K144的RAM retention功能

北极熊的脖子(16605192620@163.com) 1万+

HDOJ-1011(树形DP)

一开始没有注意到的细节: 我们必须先攻克父

还有多远 621

西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践

本文详细解析了西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践。通过实际案例和代码示例,介绍了状态机的基础认知、硬件配置、逻辑开发、调试技巧以及与MES系统集成的高级应用,帮助工程师高效实现设备自动化控制。

weixin_29255731的博客 530

使用FloodRisk2插件进行洪水风险评估

入汛以来,长江流域持续的强降雨使得沿岸多地成为洪水风险极高地区,抗洪、抢险、救灾继新冠病毒之后成为又一个攻坚阵地。如何科学地评估洪水风险,是快速决策的关键。 实际生活中,根据风险是否可控,一般将洪水风险大致分为两类:一类是通过数据分析可以得出其发生的可能性和后果,如强降雨引发的区域性洪水、水库/大坝溃决洪水等。这类洪水可以通过有关资料分析和设定一定条件计算得到可能的损失后果,也就是说,风险可以预判。另一类洪水风险基本是未知的,如滑坡堵塞河道形成堰塞湖引发的洪水,无法预知事件发生的地点和规模,具体的洪水风险无

QGISClass的博客 2877

杭电OJ 1011(C++)

#include <iostream> #include <vector> using namespace std; const int SIZE = 105; int roomNumber, trooperNumber; int cost[SIZE], brain[SIZE]; //房间所需trooper数量、brain数量 int dp[SIZE][SIZE]; /...

Intelligence1028的博客 546

uniapp: err = err.replace(this._UNI_INPUT_DIR_REG, ‘UNI_TypeError: err.replace is not a function问题修复

问题:uniapp的依赖包出现了问题,需要升级解决办法:升级uniapp依赖包,下载"semver"和”@dcloudio/uni-i18n“两个包,本地锁定postcss为7版本,就解决了。

py_boy的博客 1453

杭电oj 1011

先看题目 Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14960    Accepted Submission(s): 4024 Problem Description

u011488028的博客 2620

飞腾UEFI配置GPIO—飞腾FT2000/4 (D2000/8) GPIO引脚配置及使用

讲解了在飞腾UEFI代码中如何添加GPIO配置相关代码,并以GPIO1_B0—B7为例,将这8个引脚配置为GPIO工作模式并默认输出低电平

qq_30135687的博客 5343

Linux 服务器上部署 OpenClaw完整教程

2. 全局安装 OpenClaw 3. 初始化配置 配置模型提供商 方式一:使用配置命令(推荐) 方式二:直接编辑配置文件 在 部分添加: 配置多个模型提供商 如果你使用 Antigravity 本地代理,可以同时配置多个模型: 配置飞书集成 1. 创建飞书应用 访问 飞书开放平台 创建企业自建应用 记录 App ID 和 App Secret 2. 配置应用权限 在飞书开放平台,为应用添加以下权限:重要: 必须使用 长连接(WebSocket) 模式,不要使用 HTTP 回调!在飞书开放

Maynor的博客 5247

hdu 1011 Starship Troopers (树形背包dp)

题意 有n个洞穴编号为1~n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1。 每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子. 现在要派m个战士去找金子,从入口进入。每次只有消灭完当前洞穴的所有虫子,才可以选择进入下一个洞穴。 一个战士可以消灭20只虫子,如果要杀死x只虫子,那么要x/20向上取整即(x+19)/20个战士。 如果要获得某个洞穴的金子,必须留下足够杀死所有虫子的战士数量, 即(x+19)/20个战士,然后这些留下战士就不

D_Double's Journey 4053

非洲秃鹫优化算法(AVOA)详解:从原理到实战

非洲秃鹫优化算法(AVOA)是一种模拟秃鹫觅食行为的元启发式算法。该算法通过数学建模秃鹫的群体分工、饥饿感知和食物竞争等行为,将优化问题转化为智能觅食过程。AVOA包含四个关键阶段:(1)种群初始化与最佳秃鹫选择;(2)饥饿率控制探索与开发平衡;(3)探索阶段模拟远距离飞行搜索;(4)开发阶段模拟食物源附近的竞争行为。算法采用饥饿率函数实现自适应搜索,初期偏向全局探索,后期转向局部开发。实验表明AVOA在标准测试函数和工程设计问题上表现出优越性能,其创新性在于将秃鹫独特的生物学特性转化为高效的优化机制。

qq_42212808的博客 227

【树形DP(背包)】 HDU 1011 Starship Troopers

HDU 1011 树形背包(DP) Starship Troopers

PWZER 882

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

HDU - 1011 Starship Troopers(树形背包DP)

HDU - 1011 Starship Troopers(树形背包DP) #include<iostream> #include<cstring> #include<vector> using namespace std; const int N = 110; int n,m; vector<int> g[N]; int dp[N][N],num[N],val[N]; void dfs(int u,int fa) { int ww=(num[u]+19)

00后的博客 224

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

HDU 1011 Starship Troopers (树形DP+背包)

思路:设dp[i][j]为以i为根节点的子树中在i点还有j个troopers的最大收益。 初值需要注意,dp[i][0]必须为0,因为你要获得i中的brain必须要放至少一个trooper。 在循环中让k从1开始取可以达到同样的效果。 转移方程:dp[u][j] = max(dp[u][j],dp[u][j-k]+dp[v][k]); 代码: /* * dp[u][j] = m

Neutralzz的博客 293

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HDU 1011 Starship Troopers 树形DP(0-1背包)

题意:一棵树,有n个结点,每个结点有w[i]个bug,有p[i]的brain。我从1号结点开始走,带着m个战士。 1个战士可以消灭20个bugs如果我把某个结点的所有bug都消灭了我就能得到那个结点的brain。 如果想攻击当前结点,那么必须先攻击了它的父结点(1号点除外)。 注意: 1. 其中当你攻占了当前结点,你可以分派人手,走向几个不同的子结点,去攻占更多。也就是说,不是单一的路径。

Nicolas 822

hdu 1011 Starship Troopers (依赖背包 树形dp)

题目:         链接:

young TO challenge! 1058

HDU 1011 Starship Troopers 树形+背包dp

http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被清空时,才可以清扫它 的子节点,而清扫需要一定的人员。给定M个人员,N个结点的树,求最大brain和 这看起来是一道非常简单的背包dp 但是 写完提交wa之后,我发现...

weixin_30387423的博客 132

Hdu 1011 Starship Troopers (DP_树形DP(背包))

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题目大意:给一棵树,有n个顶点,n-1条边,每个顶有一些bugs,现在要用炸弹(就用炸弹吧)轰炸,一个炸弹最多炸死20只bug,如果某个地方为0只bug,可以滚到下一个节点去炸,n 解题思路:比较简单的树形DP+背包。本题的依赖关系可以理解成树边,到达子节点必

2595

hdu 1011 Starship Troopers (树形dp+背包)

树形dp加泛化背包,状态转移方程dp[u][j]=max(dp[u][j],dp[v][k]+dp[u][j-k]),有很多细节需要注意,叶子节点就算没有bug也要留人,还有m=0的特殊情况。#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define N 105

FirstorLoser 365

HDU 1011 Starship Troopers(树形dp+背包)

Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13109    Accepted Submission(s): 3562 Problem Description You, the l

左眼皮跳跳 689

hdu 1011 Starship Troopers(树形DP+背包问题)

1、http://acm.hdu.edu.cn/showproblem.php?pid=1011 2、题目大意; 有n个洞穴,每个洞穴中有相应的价值和bugs,现在有m个士兵,每个士兵可以消灭20个bugs,求这m个士兵最多可以获得多少价值 dp[i][j]表示以i为根用掉j个士兵获得的最大价值  dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]); 3

sdjzping的专栏 671

HDU - 1011Starship Troopers (树形dp+背包)

题目:带领m个士兵,存在n个房间(n-1条通路,1号房间为起点);每个房间有两个参数:bugs数以及价值。 每个士兵可以抵抗20个bugs,参与抵抗的士兵不继续往下走,只有消灭房间中的所有bugs,才可以得到该房间的价值。 要到达下一个房间,必须先将当前房间的bugs全部消除;并且走过的房间就不再到达。 问有m个士兵的情况下,怎样使最后得到的价值最大,最大为多少? f(i, j) = max {...

XFire的博客 256
上一篇: 【DP】 hdu4359 Easy Tree DP?
下一篇: 【树形DP+前向星】 poj3107 Godfather
ACM_Ted
博客等级 码龄15年 122粉丝 208原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值