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. phpcms添加子栏目后的读取

    一个栏目下面如果没有子栏目,那么它调用的模板就是列表页模板(及list_为前缀的模板):如果一个栏目下面有子栏目,那么它调用的就是栏目首页模板(category_为前缀的模板). 所以,当你这个栏目添 ...

  2. c++都忘记了,看了看那本发黄的C++primer,还是要去翻下了

    char *s="string"和char s[]="string"的区别 void main() { char* pStr1 = "Hello!&q ...

  3. CodeForces - 1016B

    You are given two strings ss and tt, both consisting only of lowercase Latin letters. The substring  ...

  4. MOD - Power Modulo Inverted(SPOJ3105) + Clever Y(POJ3243) + Hard Equation (Gym 101853G ) + EXBSGS

    思路: 前两题题面相同,代码也相同,就只贴一题的题面了.这三题的意思都是求A^X==B(mod P),P可以不是素数,EXBSGS板子题. SPOJ3105题目链接:https://www.spoj. ...

  5. 带你优雅的使用 icon

    前言 本篇文章其实陆陆续续写了快半年,主体部分写好了很久了,但由于种种原因一直没有发布.首先来说说写这篇文章的主要初衷是:在做前端后台项目的时候经常会用到很多 icon 图标,刚开始还好,但随着项目的 ...

  6. ASLR

    @author:dlive ASLR address space layout randomization 微软从windows vista/windows server 2008(kernel ve ...

  7. Python3中字符串的编码与解码以及编码之间转换(decode、encode)

    一.编码 二.编码与解码 Python3中对py文件的默认编码是urf-8.但是字符串的编码是Unicode. 由于Unicode采用32位4个字节来表示一个字符,存储和传输太浪费资源,所以传输和存储 ...

  8. 设计模式--工厂模式 caffe_layer注册

    来源:http://www.cnblogs.com/zhouqiang/archive/2012/07/20/2601365.html 来源:http://blog.luoyetx.com/2016/ ...

  9. 终止函数 atexit()

    函数名: atexit   头文件:#include<stdlib.h>   功 能: 注册终止函数(即main执行结束后调用的函数)   用 法: int atexit(void (*f ...

  10. 这是我在word 2010上发布的第一篇文章

    1.设置word 2010,添加cnblogs帐户 配置参考链接 其中URL地址为: http://rpc.cnblogs.com/metaweblog/fariver,在cnblogs配置的最下方可 ...