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

双传声器法测量吸声材料的吸声系数(公式推导与解释) 在双传声器法中,通过测量两个位置的声压 p1和 p2​,可以分离出入射波和反射波的声压分量。双传声器法一般在阻抗管中进行,阻抗管的一端为平面波声源,另一端放置待测材料。两个传声器放置在靠近材料的阻抗管内,用于测量管道内的声压。双传声器法是一种常用于测量材料吸声系数的实验方法,通过在管道内使用两个传声器测量声波的入射和反射,来计算出材料的吸声系数。当测试样品较少时,测试时,需要交换两个传声器的位置,目的是为了相位校准。 阅读详情

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

f(i, j) = max { max{ f(i, j-k) + f(v, k) | 1<=k<=j-cost(i) } |  v是i的儿子节点 }

#include <bits/stdc++.h>

using namespace std;
const int maxn=110;
int n,m,val[maxn],w[maxn];
vector<int>a[maxn];
int dp[maxn][maxn];
void dfs(int u,int fa)
{
    if(!w[u]&&a[u].size()==1&&u!=1)//是叶子节点但是没有bug,依然需要士兵过去!
    w[u]++;
    for(int i=w[u];i<=m;i++)
        dp[u][i]=val[u];
    for(int i=0;i<a[u].size();i++)
    {
        int v=a[u][i];
        if(v==fa) continue;
        dfs(v,u);
        for(int j=m;j>=w[u];j--)///背包过程
        for(int k=1;k<=j-w[u];k++)
        {
            dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);///方程
        }
    }
}
int main()
{
    ///freopen("in.txt","r",stdin);
    while(scanf("%d%d",&n,&m),n!=-1&&m!=-1)
    {
        for(int i=1;i<=n;i++)
        {
            int tmp;
            scanf("%d%d",&tmp,&val[i]);
            w[i]=tmp/20;
            if(tmp%20) w[i]++;///多出来的bugs
        }
        for(int i=1;i<=n;i++)
            a[i].clear();
        for(int i=1;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            a[x].push_back(y);
            a[y].push_back(x);
        }
        memset(dp,0,sizeof dp);
        if(m==0)//判断没有士兵哪个节点也去不了
        {
            puts("0");
            continue;
        }
        dfs(1,-1);

        printf("%d\n",dp[1][m]);
    }
    return 0;
}

写的另一个版本的dp方程思路略有不同,代码比较繁琐

#include <bits/stdc++.h>

using namespace std;
const int maxn=110;
int n,m,val[maxn],w[maxn];
vector<int>a[maxn];
int tmp[maxn],dp[maxn][maxn];
void dfs(int u,int fa)
{
   if(!w[u]&&a[u].size()==1&&u!=1)///
    w[u]++;
    for(int i=0;i<a[u].size();i++)
    {
        int v=a[u][i];
        if(v==fa) continue;
        dfs(v,u);
        memset(tmp,0,sizeof tmp);//暂时存已经入选的子节点的最有情况
        for(int j=0;j<=m;j++)
        for(int k=0;k<=(m-j);k++)
        {
            int t1=dp[u][j],t2=dp[v][k];
            if(!j) t1=0;////判断不为0是因为子节点那也必须得有士兵过去
            if(!k) t2=0;////判断不为0是因为子节点那也必须得有士兵过去
            tmp[j+k]=max(tmp[j+k],t1+t2);
        }
        for(int j=0;j<=m;j++)
        dp[u][j]=tmp[j];///暂时存已经入选的子节点的最有情况
    }
    for(int j=m;j>=w[u];j--)
        dp[u][j]=dp[u][j-w[u]]+val[u];///再把自身需要的w[u]处理一下
    for(int j=0;j<w[u];j++)
        dp[u][j]=0;

}
int main()
{
   // freopen("in.txt","r",stdin);
    while(scanf("%d%d",&n,&m),n!=-1&&m!=-1)
    {
        for(int i=1;i<=n;i++)
        {
            int tmp;
            scanf("%d%d",&tmp,&val[i]);
            w[i]=tmp/20;
            if(tmp%20) w[i]++;///
        }
        for(int i=1;i<=n;i++)
            a[i].clear();
        for(int i=1;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            a[x].push_back(y);
            a[y].push_back(x);
        }
        memset(dp,0,sizeof dp);
        if(m==0)///
        {
            puts("0");
            continue;
        }
        dfs(1,-1);
        printf("%d\n",dp[1][m]);
    }
    return 0;
}

 

JavaSwing_1.1: FlowLayout(流式布局) FlowLayout,流式布局管理器。按水平方向依次排列放置组件,排满一行,换下一行继续排列。 阅读详情

相关推荐

TCP报文 Flood攻击原理与防御方式

TCP交互过程中包含SYN、SYN-ACK、ACK、FIN和RST报文,这几类报文也可能会被攻击者利用,海量的攻击报文会导致被攻击目标系统资源耗尽、网络拥塞,无法正常提供服务。接下来我们介绍几种常见的Flood攻击的原理和防御方式。

qq_32044265的博客 4219

【树形DP+背包】 hdu1011 Starship Troopers

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 undergro

Ted's 游乐园 914

Opencv相机校准之棋盘格标定

Reference: https://yq.aliyun.com/articles/62472

y459541195的博客 3万+

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

Type-C转DP1.4转C双向互传转接线方案

Type-C转DP双向互转方案的核心在于利用Type-C接口中的Alt Mode(交替模式)功能。通过利用Type-C接口的Alt Mode功能,该方案实现了Type-C接口与DP接口之间的双向互传,极大地丰富了用户的视觉体验。在选择Type-C转DP双向互转方案时,用户需要关注兼容性、性能需求、线缆长度和品牌等因素,以确保获得最佳的传输质量和使用体验。因此,Type-C转DP双向互转方案应运而生,旨在实现Type-C接口与DP接口之间的无缝连接,满足用户对高效能和高清晰度视频传输的需求。

m0_70875024的博客 4976

PPPoe的抓包分析(详细)

PPPoe的报文结构 可以看出PPPoe的报文结构其实很简单,只不过是将PPPoe的报文塞到以太网的载荷中,而且它的头部字段也十分的简单,TLV就不说了,code字段表示了PPPoe不同的报文类型,比较常见的就是上面的五个报文了,PPPoe的报文类型其实还蛮多的。session ID主要的作用就是标识一段会话,因为使用PPPoe的最主要作用就是使得多台设备可以借助以太网多点接入多点访问的特点去和一台设备做上网认证请求,这样运营商一台认证设备就可以满足多个用户的认证请求,这和PPP相比起来好的不止一点。

qq_47529104的博客 7868

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

HDU 1011 树形背包(DP) Starship Troopers

PWZER 882

无线自组织网络基础知识

参考书籍:《无线自组织网络路由协议及应用》 目录第一章 绪论1.1 无线自组织网络概述1.1.1 无线自组织网络的定义及分类1.1.2无线自组织网络的主要特点1.1.3无线自组织网络的应用与发展1.无线自组织网络的应用2.无线自组织网络的起源和发展1.2典型的无线自组织网络1.2.1移动Ad Hoc网络1、移动Ad Hoc网络的定义2.移动AdHoc网络的特点3.移动Ad Hoc网络的应用1.2....

逸凌Time 2万+

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

25年PINN创新点大盘点!

在科研论文的激烈角逐中,想轻松产出高含金量成果?物理信息神经网络(PINN)堪称“宝藏研究方向”,是冲击高分区论文的绝佳赛道!对于渴望发表优质论文的科研伙伴,这三大研究路径值得重点关注。首先是自适应PINN,在PINN训练过程中,物理方程与实测数据间的矛盾常常导致权重调节困难,而恰好直击这一痛点,是极具价值的研究方向。其次,同样前景广阔,传统多物理场同时训练效果欠佳,如今分阶段训练方法脱颖而出,成效显著且竞争较小。最后,探索及多任务学习等技术的融合,能实现优势叠加,碰撞出创新火花。

Malaai的博客 1970

matsim教程及其案例

MATSim 是一个强大的交通仿真工具,适合研究交通政策、出行行为优化和城市规划。建议从官方示例入手,逐步尝试修改参数和扩展功能。遇到问题时,优先查阅官方文档和社区讨论。(Multi-Agent Transport Simulation Toolkit)的教程和案例资源整理,涵盖基础入门、核心概念、实际应用案例及学习路径。MATSim 是一个开源的、基于多智能体的交通仿真框架,用于模拟城市交通系统中的出行行为、交通流量和交通政策影响。

weixin_70682362的博客 1093

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

拆解一个800G光模块:手把手带你认识里面的MT插芯和光纤阵列(FA)

本文详细拆解了800G光模块中的关键组件MT插芯和光纤阵列(FA),揭示了并行光学技术如何实现高速数据传输。通过显微镜下的精密观察,展示了MT插芯的高精度构造和光纤阵列的连接奥秘,同时解析了高精度研磨工艺对光信号传输的重要性。这些微型组件是高速收发模块实现800Gbps带宽的核心技术。

weixin_30839881的博客 1546

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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

题目:         链接:

young TO challenge! 1058

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

树形dp ( vector dfs 01背包 ) hdu 1011 Starship Troopers

#include #include #include #include using namespace std; int n, m; int dp[101][101]; int used[101]; int need[101]; int get[101]; vectorv[101]; void dfs( int x ) { int i, j, k; used[x]=1;

海阔天空 556

HDU 1011 Starship Troopers---树形dp+有依赖的背包

dp[i][j]表示 用i 个士兵 在j为根节点的 最大值 #include #include #include #include #include using namespace std; struct node{ int a,b; }p[110]; vector q[110]; //用vector存 邻接表 int dp[110][110],f[110],m; void df

xiaoyu1_1的专栏 670

hdu 1011 Starship Troopers dp 带点坑的树形背包 ★

Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17034    Accepted Submission(s): 4509 Problem Description You, t

便纵有千种风情 729

(树形dp & 有依赖的背包)hdu 1011 Starship Troopers & hdu 1561 The more, The Better

题目 hdu1011 题意: 一张图有 n 个结点,有 m 个士兵,每个士兵可以消灭 20 个虫子,结点1是入口,通过边可以走的任意一个结点并消耗结点上的虫子对应的士兵获得这个结点对应的脑子,当没有士兵后就不能继续往下走。 另一种解释: 有一个m个容量的背包,有 n 个物品,每个物品的一个代价u 和一个价值v,有些物品如果拿走需要对应的物品也被拿走,求m个容量最大的价值。(即背包9讲中的有依赖的背包) 思路: 每个结点p 的代价为c [ p ],价值为v [ p ] 从结点1 dfs 下去,在每个结点p 中

ymxyld的博客 164
上一篇: POJ - 1947Rebuilding Roads(树形dp)
下一篇: HDU - 3586 Information Disturbing(树形dp+二分)
GoLakerswxy
博客等级 码龄9年 41粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值