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

自己第一次做,看了一下别人的思路,结合着对简单背包问题的求解方式自己一次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 ;
}

HDU 1561 树形DP背包问题的更多相关文章

  1. HDU 1561 树形DP入门

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. HDU 1561 树形DP(入门)

    题目链接:  HDU 1561 The more, The Better #include <iostream> #include <cstdio> #include < ...

  3. HDU 1561 (树形DP+背包)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1561 题目大意:从树根开始取点.最多取m个点,问最大价值. 解题思路: cost=1的树形背包. 有 ...

  4. hdu 1561(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路:dp[u][i]表示以u为根的树选了i个子节点. #include<iostream ...

  5. hdu 1561 树形dp+分组背包

    题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值. 一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m) ...

  6. hdu 1561 树形DP n个选m个价值最大

    http://acm.hust.edu.cn/vjudge/problem/18068 #include <iostream> #include <string> #inclu ...

  7. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  8. HDU 1520 树形dp裸题

    1.HDU 1520  Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> ...

  9. HDU 2196树形DP(2个方向)

    HDU 2196 [题目链接]HDU 2196 [题目类型]树形DP(2个方向) &题意: 题意是求树中每个点到所有叶子节点的距离的最大值是多少. &题解: 2次dfs,先把子树的最大 ...

随机推荐

  1. navicat mysql报错误:2013 Lost connection to MySQL server during query

    好像是MySQL的navicat UI界面跟数据的连接问题,如果直接用命令导入数据的话,或许能规避这个问题.

  2. Node“getTextContent() is undefined for the type Node”处理办法

    最近一个项目在MyEclipse导入后总是报getTextContent() is undefined for the type Node错误. 经过查找原来是因为Node类为JDK中自带的(org. ...

  3. EditText(4)常用属性详解

    常用的属性: 显示密码 通过设置EditText的setTransformationMethod()方法来实现隐藏密码或这显示密码. editText.setTransformationMethod( ...

  4. 使用Oracle实现的MyBatis分页查询效果

    1.mybatis.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configur ...

  5. Probabilistic locking in SQLite

    In SQLite, a reader/writer lock mechanism is required to control the multi-process concurrent access ...

  6. vue2.0路由(跳转和传参)经典介绍

    声明式 <router-link :to="...">编程式router.push(...) router.push('home')                 / ...

  7. 在iframe内页面完全加载完后,关闭父页面生成的div遮罩层

    遮罩层div为iframe父页面生成,需在iframe内页面完全加载完后,关闭遮罩层 alertMsgClose() :函数为关闭遮罩层函数 此段代码在iframe页面内: <script> ...

  8. zencart,分类,所有,显示

    改的文件:includes/classes/category_tree.php,最简单的修改 if (!isset($first_element)) {        $first_element = ...

  9. MS-DOS Batch Script Template

    @echo off @setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION @rem Name: @rem Purpose: @rem @rem Autho ...

  10. 网络编程基础_3.APC队列

    APC队列 #include <stdio.h> #include <windows.h> // 保存 IO 操作的结果 CHAR Buffer1[] = { }; CHAR ...