hdu1561(树形背包)

给定n,m表示n个城堡,我们可以选择攻占m个城堡。要使得价值最大

接下来n行 a b,   第i行的a b,表示攻占第i个城堡的价值为b,但需要先攻占第a个城堡

如果有多个a=0的点,那么就不是一棵树,但是我们可以建立一个根结点0,让根结点指向那些a=0的点,  同时m++,因为更结点必须被占据,占据一个结点需要一个容量

每个结点可以选或者不选,但是如果选,当且仅当父亲结点也被选。

所以是树上面的01背包问题,所以只要在每个结点处枚举当前容量和孩子的容量,算出各个容量的最大值。

状态转移方程见代码

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 typedef long long LL;
15 const int INF = 1<<30;
16 const int N = 200+10;
17 struct Edge
18 {
19     int v,next;
20 }g[N];
21 int head[N],e;
22 int val[N];
23 int dp[N][N];//dp[i][j] 表示对于第i个城堡,有容量j能获得的最大价值
24 int n,m;
25 void init(int n)
26 {
27     for(int i=0; i<=n; ++i)
28         head[i] = -1;
29     e = 0;
30 }
31 void addEdge(int a, int b)
32 {
33     g[e].v = b;
34     g[e].next = head[a];
35     head[a] = e++;
36 }
37 void dfs(int u, int fa)
38 {
39     for(int i=1; i<=m; ++i)
40         dp[u][i] = val[u];
41     for(int i=head[u]; i!=-1; i=g[i].next)
42     {
43         int v = g[i].v;
44         if(v==fa) continue;
45         dfs(v,u);
46         for(int j=m; j>=1; --j)
47             for(int k=1; k+j<=m; ++k)
48                 dp[u][j+k] = max( dp[u][j+k], dp[u][j]+dp[v][k] );
49     }
50 }
51 int main()
52 {
53     int i,a,b;
54     while(scanf("%d%d",&n,&m),n)
55     {
56         init(n);
57         bool flag = false;
58         for(i=1; i<=n; ++i)
59         {
60             scanf("%d%d",&a,&val[i]);
61             if(a==0)
62                 flag = true;
63             addEdge(i,a);
64             addEdge(a,i);
65         }
66         memset(dp,0,sizeof(dp));
67         if(flag)
68         {
69             m++;
70             dfs(0,-1);
71             printf("%d\n",dp[0][m]);
72         }
73         else
74         {
75             dfs(1,-1);
76             printf("%d\n",dp[1][m]);
77         }
78
79
80     }
81     return 0;
82 }

时间: 2024-10-24 22:40:49

hdu1561(树形背包)的相关文章

hdu1561:树形背包dp

给定n个地点,每个地点藏有cost[i]的宝物,取得某些宝物有时需要先取其他宝物,现在让我们选m个地点问最多可以选多少宝物? 还是挺裸的树形背包dp吧,不难,关键还是中间dp的部分.可以做模板了->_-> 注意点:多组数据的话如果第一组对了然后其他都错了,那么很有可能是初始化的时候漏了.这次找可很久才知道差了e[0].clear().平时的习惯都是从1开始. --------------------------------------------------------------------

POJ 1155 树形背包

题意:从一个发射站发射电视,只有叶子节点是用户,收到一部分费用,所有的边都有花费,求在不亏本的情况下,最多可以让多少用户(叶子结点)收看到电视. 分析:树形背包. 状态定义: dp(i,j) : 以 i 为根的,让 j 个用户看到电视,最大获益(可以为负数).那么sz不再是原来的定义了. 最后遍历 j,第一个不为负数的就是答案. 状态转移:树形背包,dp(i,j) = max(d(i,j) , dp(i)(k)+dp(son,j-k)-w); #include <algorithm> #inc

【BZOJ2427】[HAOI2010]软件安装 Tarjan+树形背包

[BZOJ2427][HAOI2010]软件安装 Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j(包括软件j的直接或间接依赖)的情况下才能正确工作(软件i依赖软件j).幸运的是,一个软件最多依赖另外一个软件.如果一个软件不能正常工作,那么它能够发挥的作用为0.我们现在知道

【bzoj4987】Tree 树形背包dp

题目描述 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. 输入 第一行两个正整数n,k,表示数的顶点数和需要选出的点个数. 接下来n-l行每行3个非负整数x,y,z,表示从存在一条从x到y权值为z的边. I<=k<=n. l<x,y<=n 1<=z<=10^5 n <= 3000 输出 一行一个整数,表示最小的距离和. 样例输入 10 7 1 2 35129 2 3 42976 3 4 244

NYOJ 674 善良的国王(树形背包DP)

善良的国王 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 传说中有一个善良的国王Good,他为了不劳民伤财,每当建造一个城镇的时候都只用一条路去连接,这样就可以省很多的人力和物力,也就说如果有n个城镇,那么只需要n-1条路就可以把所有的城镇链接起来了(也就是一颗树了).但是不幸的事情发生了:有个一强大的帝国想要占领这个国家,但是由于国王Good的兵力不足,只能守护m个城镇,所以经过商量,国王Good只能从他的所有城镇中选择m个相链接的城市,并且把所有可以链接到这m

【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp

题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了保证团队的和谐,JYY需要保证,如果招募了候选人i,那么候选人Ri"也一定需要在团队中.当然了,JYY自己总是在团队里的.每一个候选人都有一个战斗值Pi",也有一个招募费用Si".JYY希望招募K个候选人(JYY自己不算),组成一个性价比最高的团队.也就是,这K个被JYY选择的候

UVa 1407 树形背包 Caves

这道题可以和POJ 2486 树形背包DP Apple Tree比较着来做. 参考题解 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 using namespace std; 7 8 const int maxn = 500 + 10; 9 10 int n, Q; 11 vec

poj2486Apple Tree[树形背包!!!]

Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9989   Accepted: 3324 Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to an apple tree. There are N nodes in the tree. Each node has an amoun

hdu 1011 Starship Troopers 树形背包

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:有n个洞,每个洞有若干虫子和脑子,洞之间相连形成一棵树.你有m个士兵,一个士兵可以打10只虫子,士兵留下后就不能走了.从一号洞开始打,求获得最多的脑子. 树形背包.如果你在某一个洞里,有m个士兵.你可以选择派遣k个士兵去攻打与洞相连的某个子树.可以先用递归算出子树的情况.这类似于背包九讲的泛化背包. 定义 考虑这样一种物品,它并没有固定的费用和价值,而是它的价值随着你分配给它的费用而变化

hdu1561The more, The Better(树形背包)

The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8811    Accepted Submission(s): 5141 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物