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

 
题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被清空时,才可以清扫它          的子节点,而清扫需要一定的人员。给定M个人员,N个结点的树,求最大brain和
 
这看起来是一道非常简单的背包dp
但是
写完提交wa之后,我发现这道题,并不简单!因为他的题意并不是完全和我找到的题意一样(我承认我语文很差劲所以随便找个题解看题意。。),题目中要求每一个人是不能往回走的,所以节点bug值为0时也不能随意收集brain,一个人员只能收集一条链。当然0个人的时候不管怎么样都收集不到brain直接特判。
这个问题可以通过一个非常之骚的操作解决,操作如下
f[a][b]代表以a点为根的子树布置b个人能得到的最大brain的和
 for(int k=m;k>=bu[x];k--){
for(int j=;j+k<=m;j++){//注意这个地方从1开始
f[x][k+j]=max(f[x][k+j],f[x][k]+f[y][j]);
}
}

j从1开始循环完美避免了不给下面的路分配人却得到brain值的事情发生,然后就可以ac了。。。

但是并没有ac。。为什么呢。。。因为我,没有把写好的清空数据函数放到主程序里。。。

然后我wa了8次。。。引以为戒。
代码:
 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=;
const double eps=1e-;
const int modn=;
int n,m;
struct nod{
int next,y;
}e[maxn*];
int bu[maxn]={},bra[maxn]={},head[maxn]={},tot=;
bool vis[maxn]={};
int f[maxn][maxn]={};
void init(int x,int y){
e[++tot].y=y;
e[tot].next=head[x];
head[x]=tot;
}
void dfs(int x){
vis[x]=;
int y;
for(int i=bu[x];i<=m;i++){
f[x][i]=bra[x];
}
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
if(!vis[y]){
dfs(y);
for(int k=m;k>=bu[x];k--){
for(int j=;j+k<=m;j++){
f[x][k+j]=max(f[x][k+j],f[x][k]+f[y][j]);
}
}
}
}
}
void yu(){
tot=;memset(f,,sizeof(f));
memset(head,,sizeof(head));
memset(vis,,sizeof(vis));
}
int main(){
for(;;){
yu();
scanf("%d%d",&n,&m);
if(n==-||m==-){
break;
}
for(int i=;i<=n;i++){
scanf("%d%d",&bu[i],&bra[i]);
bu[i]=(bu[i]+)/;
}
int x,y;
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
init(x,y);init(y,x);
}
if(m==){
printf("0\n");
continue;
}
dfs();
printf("%d\n",f[][m]);
}
return ;
}

HDU 1011 Starship Troopers 树形+背包dp的更多相关文章

  1. hdu 1011 Starship Troopers 树形背包dp

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

  2. hdu 1011 Starship Troopers(树形背包)

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

  3. hdu 1011 Starship Troopers(树形DP入门)

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

  4. hdu 1011 Starship Troopers(树上背包)

    Problem Description You, the leader of Starship Troopers, are sent to destroy a base of the bugs. Th ...

  5. [HDU 1011] Starship Troopers (树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 dp[u][i]为以u为根节点的,花了不超过i元钱能够得到的最大价值 因为题目里说要访问子节点必 ...

  6. HDU 1011 Starship Troopers 树形DP 有坑点

    本来是一道很水的树形DP题 设dp[i][j]表示,带着j个人去攻打以节点i为根的子树的最大收益 结果wa了一整晚 原因: 坑点1: 即使这个节点里面没有守卫,你如果想获得这个节点的收益,你还是必须派 ...

  7. HDU 1011 Starship Troopers【树形DP/有依赖的01背包】

    You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ...

  8. hdu 1011(Starship Troopers,树形dp)

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

  9. hdu 1011 Starship Troopers 经典的树形DP ****

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

随机推荐

  1. 【不能继续浪啦】BZ做题记录[7.01~7.06]

    距离上次提交..><居然已经过去一个半月了... 然后再去看看人家RXDoi.. 差距越来越大啦... 最后更新时间:7.06 19:06 [07.03 21:02]夏令营自修课逃逃真爽. ...

  2. Http Header信息&状态码

    Header信息   (Status-Line):状态项,包括协议类型,http返回码和状态:  Cache-control:是否可以被缓存(public可以:private和no-cache不可以: ...

  3. 多线程中的超时, 如Socket超时

    ; ,,, ->$port { print "-->$port\r"; #say "\r"; await Promise.anyof( Promis ...

  4. 新一代的USB 3.0传输规格

    通用序列总线(USB) 从1996问世以来,一统个人电脑外部连接界面,且延伸至各式消费性产品,早已成为现代人生活的一部分.2000年发表的USB 2.0 High-speed规格,提供了480Mbps ...

  5. hdu 2475 BOX (splay)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 2475 Splay树是一种神奇的东西... 题意: 有一些箱子,要么放在地上,要么放在某个箱子里面 . 现在有两种操作: (1) MOV ...

  6. linux系统定时任务设置

    .使用at命令设置一次性定时任务 2.使用crontab设置周期性定时任务 1)cd /home 目录下,使用vi test.py创建文件,内容如下: #!/usr/bin/python#coding ...

  7. ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#)

    最早看到这个题目是从@ 程序媛想事儿(Alexia) 的 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏 开始的,然后这几天陆陆续续有N个小伙伴发表了自己的文章 ...

  8. oracle客户端不需要配置tnsnames.ora文件直接连接服务器数据库

    在以前的oracle使用过程中,想要在客户端连接到服务器时,都是在客户端中的tnsnames.ora文件配置如以下内容: adb = (DESCRIPTION = (ADDRESS_LIST = (A ...

  9. java网络编程三次握手四次挥手

    第一次握手:client设置syn=1,随机产生一个序列号seq=x,将数据包发送到server.client进入syn_send状态, 等待server确认. 第二次握手:server查看clien ...

  10. 【转载】python import和from import

    import和from import都是将其他模块导入当前模块中. 刚开始一直以为import和from import唯一的区别,就是from import可以少写一些模块名.虽然from XX im ...