这是自己第一道背包上树形结构问题,不是很理解这个概念的可以先看看背包九讲

自己第一次做,看了一下别人的思路,结合着对简单背包问题的求解方式自己一次AC了还是有点小激动的

题目大意是:

攻克m个城市,每个城市都有对应数量的宝贝,攻克某一个城市必须保证其对应的某一个特定城市已经被攻克,希望得到最多数量的宝贝

很容易根据题目画出一个对应关系的树形结构,每个节点都有一个对应的宝物的数量

我们用dp[i][j]存 i 号节点它下方子树中 有 j 个城市被攻克时得到的宝物最大数量 , 此时的 i 号是没有被攻克的!

然后通过dfs自底向上更新

 /*
总的u下方子树攻克了j个城市,为当前v姿势分配k个城市攻克
添加当前v包含了攻克k-1个子树的城市,要添加子树v必须
同时保证v被攻克,所以加上的是dp[v][k-1] + val[v]
*/
for(int j = m ; j>= ; j--){
for(int k = j ; k> ; k--){
dp[u][j] = max(dp[u][j] , dp[u][j-k] + dp[v][k-] + val[v]);
}
}

这里可以理解为当根节点u下方有 j 个城市被攻克时, 若有 k 个城市的攻克来自v的子树, 那么v必然要被攻克 , val[v],不然其下方的城市不能攻克

除去v还有 k -1个v节点对应子树中的城市要攻克 ,也就是 dp[v][k-1]

 #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = ; int dp[N][N] , val[N] , first[N] , k; struct Edge{
int y , next;
}e[N]; void add_edge(int x , int y)
{
e[k].y = y , e[k].next = first[x];
first[x] = k++;
} void dfs(int u , int m)
{
for(int i=first[u] ; i!=- ; i=e[i].next){
int v = e[i].y;
dfs(v , m);
/*
总的u下方子树攻克了j个城市,为当前v姿势分配k个城市攻克
添加当前v包含了攻克k-1个子树的城市,要添加子树v必须
同时保证v被攻克,所以加上的是dp[v][k-1] + val[v]
*/
for(int j = m ; j>= ; j--){
for(int k = j ; k> ; k--){
dp[u][j] = max(dp[u][j] , dp[u][j-k] + dp[v][k-] + val[v]);
}
}
}
} int main()
{
// freopen("a.in" , "r" , stdin);
int n , m , a , b;
while(scanf("%d%d" , &n , &m) , n||m)
{
memset(first , - , sizeof(first));
k = ;
for(int i= ; i<=n ; i++)
{
scanf("%d%d" , &a , &b);
add_edge(a , i);
val[i] = b;
}
memset(dp , , sizeof(dp));
dfs( , m); printf("%d\n" , dp[][m]);
}
return ;
}

最新文章

  1. git入门操作命令(转载)
  2. Objective-C(内存管理)
  3. js中Math.round、parseInt、Math.floor和Math.ceil小数取整总结
  4. 海贼王之&mdash;&mdash;梦想音乐
  5. 安装hbase-0.98.9-hadoop2
  6. 归约函数reduce&amp;映射数组map(笔记)
  7. C# Json反序列化处理
  8. 2015华为德州扑克入境摘要——软体project
  9. 101490E Charles in Charge
  10. bzoj 4836: 二元运算
  11. Dubbo和Spring Cloud微服务架构&#39;
  12. 【bioinfo】生物信息学——代码遇见生物学的地方
  13. 基于C#net4.5websocket客户端与服务端
  14. CF939D Love Rescue 并查集
  15. 源码解读 Laravel PHP artisan config:cache
  16. 强震记录和GPS记录,地震波记录的区别
  17. AQS源码分析
  18. maven私服Nexus3.2的使用
  19. DevCloud for CloudStack Development
  20. Message Queue中的推与拉(转)

热门文章

  1. bzoj 4031: [HEOI2015]小Z的房间【矩阵树定理】
  2. P4161 [SCOI2009]游戏
  3. Linux 常规操作指南
  4. Scala-基础-数组(1)
  5. JavaScript(十三)面向对象
  6. Spark学习之基础相关组件(1)
  7. jboss项目设置域名
  8. 重构27-Remove God Classes(去掉神类)
  9. 初始MongoDB------将MongoDB创建为Windows服务
  10. Oracle+struts2实现用户登入并显示访问次数