hdu 1011 树形背包
2024-08-31 02:02:10
http://blog.csdn.net/libin56842/article/details/9876503
这道题和poj 1155的区别是:
poj1155是边的价值,所以从边的关系入手
hdu1011是点的价值,从点的关系入手,所以node没有val,在dp时不用记录叶子节点个数,只需要对每个点用背包遍历一遍即可
dp[root][j+k] = max(dp[root][j+k],dp[p][k]+dp[root][j])
dp表示在i点放j人能得到的能量
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std; #define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 1010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f int n,m; struct node
{
int y,next;
}tree[]; int head[],dp[][],ptr=; int bug[],vl[],vis[]; void add(int x,int y)
{
tree[ptr].y = y;
tree[ptr].next = head[x];
head[x] = ptr++;
} void dfs(int root)
{
int i,j,k;
vis[root] = ;
int cost = (bug[root]+)/;
for(i=cost;i<=m;i++)
dp[root][i] = vl[root]; for(i=head[root]; i!=-; i=tree[i].next)
{
int p = tree[i].y; if(!vis[p])
{
dfs(p);
for(j=m;j>=cost;j--)
{
for(k=;j+k<=m;k++)
{
dp[root][j+k] = max(dp[root][j+k],dp[p][k]+dp[root][j]);
}
}
}
}
} int main()
{
int i,j,k,a,b;
while(~sf("%d%d",&n,&m) && m+n>)
{
mem(head,-);
ptr = ;
for(i=;i<=n;i++)
{
sf("%d%d",&bug[i],&vl[i]);
} for(i=;i<=n;i++)
{
sf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
if(!m)
{
pf("0\n");
continue;
}
mem(dp,);
mem(vis,);
dfs();
pf("%d\n",dp[][m]);
}
return ;
}
/*
5 10
50 10
40 10
40 20
65 30
70 30
1 2
1 3
2 4
2 5
1 1
20 7
-1 -1
*/
最新文章
- Javascript动态执行JS(new Function与eval比较)
- java从基础知识(十)java多线程(下)
- 导入镜像文件,分区启动liunx
- Maven将依赖的所有jar包打成一个jar
- WinForm------GridControl的部分属性介绍
- 【Android】首次进入应用时加载引导界面
- 【matlab】读写文件
- [Tommas] UNION 和 UNION ALL 的区别
- Inno Setup技巧[界面]添加和自定义左下角标签
- 一款C++静态分析工具 —— CppDepend
- Linux--struct file结构体
- integer与int区别以及integer.values()方法详解
- centos7安装nodejs
- 第二届强网杯-simplecheck
- 用户态与内核态 &; 文件流与文件描述符 简介【转】
- ORA-28000: the account is locked解决办法
- AppFabric查询工作流实例
- Linux 修改用户组后,如何关闭所有 X session 下使得组生效?
- selenium+Page Objects(第一话)
- Revit MEP API连接器类别