http://blog.csdn.net/libin56842/article/details/9908199

树形背包:

首先是建树,每个结构体为一个节点,包括下一个点序号,值,和next。

tree[ptr]会保存所有的节点序列,而head数组则是保存每个节点的最后一个子节点序列中的位置,next则是保存上一个子节点在序列中的位置,若没有则为-1。

遍历时从i=head[root]出发,到i=-1结束,不断往子节点遍历,同一层之间用next遍历,就可以遍历树的所有节点。

树状dp。由于求的是最多多少用户,那么我们可以把用户个数当成一个状态。dp[i][j]代表i节点为根节点的子树j个用户的时候最大剩余费用。

     则dp[i][j] = max(dp[i][j], dp[i][k]+dp[son][j-k]-w[i][son]);

注意两点,第一点是上面式子中的dp[i][k]必须先用一个tem[MAX]数组提取出来,因为在计算的过程中会相互影响。第二点是价值可能是负值,所以dp初始化的时候要初始化为负的最大值。

#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,val,next;
}tree[]; int head[],dp[][],num[],tem[],ptr=; void add(int x,int y,int val)
{
tree[ptr].y = y;
tree[ptr].val = val;
tree[ptr].next = head[x];
head[x] = ptr++;
} void dfs(int root)
{
int i,j,k;
for(i=head[root]; i!=-; i=tree[i].next)
{
int p = tree[i].y;
dfs(p); for(j=;j<=num[root];j++)
tem[j] = dp[root][j]; for(j=;j<=num[root];j++)
{
for(k=;k<=num[p];k++)
{
dp[root][k+j] = max(dp[root][j+k],tem[j]+dp[p][k]-tree[i].val);
//pf("%d %d %d %d\n",root,j,k,dp[root][j+k]);
}
}
num[root]+=num[p];
}
} int main()
{
int i,j,k,a,b;
while(~sf("%d%d",&n,&m) && m+n)
{
mem(head,-);
for(i=;i<=n-m;i++)
{
sf("%d",&k);
num[i] = ;
for(j=;j<k;j++)
{
sf("%d%d",&a,&b);
add(i,a,b);
}
}
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
dp[i][j] = -;
} for(i=n-m+;i<=n;i++)
{
num[i] = ;
sf("%d",&dp[i][]);
}
dfs();
for(i=m;i>=;i--)
{
if(dp[][i]>=)
{
pf("%d\n",i);
break;
}
}
}
return ;
}

poj 1155 树形背包的更多相关文章

  1. POJ 1155 树形背包(DP) TELE

    题目链接:  POJ 1155 TELE 分析:  用dp[i][j]表示在结点i下最j个用户公司的收益, 做为背包处理.        dp[cnt][i+j] = max( dp[cnt][i+j ...

  2. POJ 1155 (树形DP+背包+优化)

    题目链接: http://poj.org/problem?id=1155 题目大意:电视台转播节目.对于每个根,其子结点可能是用户,也可能是中转站.但是用户肯定是叶子结点.传到中转站或是用户都要花钱, ...

  3. POJ 1155 TELE 背包型树形DP 经典题

    由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...

  4. POJ 1155 树形DP

    题意:电视台发送信号给很多用户,每个用户有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号. 转自:http://www.cnblogs.com/andre050 ...

  5. POJ 1155-TELE(树形背包)

    题意:电视台发送信号给很多用户,每个用户(叶子节点)有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号. 分析:问题与以i为根节点的子树所包含的叶子数 #incl ...

  6. poj 1947 树形背包 (删边)

    http://blog.csdn.net/woshi250hua/article/details/7632785 这道题我一开始想的dp[i][j],i是节点,j是删除的点数,dp是最少删边的个数,然 ...

  7. poj 1947 树形背包

    重做这道题 http://blog.csdn.net/woshi250hua/article/details/7632785 http://blog.csdn.net/shuangde800/arti ...

  8. POJ 2486 树形背包DP Apple Tree

    设d(u, j, 0)表示在以u为根的子树中至多走k步并且最终返回u,能吃到的最多的苹果. 则有状态转移方程: #include <iostream> #include <cstdi ...

  9. UVa 1407 树形背包 Caves

    这道题可以和POJ 2486 树形背包DP Apple Tree比较着来做. 参考题解 #include <iostream> #include <cstdio> #inclu ...

随机推荐

  1. php面向对象编程_1

    1, php面向对象编程的三大特征: (1) 封装性,封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法)才能对数据进行操作. (2) 继承 ...

  2. ArchLinux 下 VirtualBox 增强设置

    0.前言: 其实这个标题本来不是我的本意,因为我的ArchLinux开机启动报错了!. 原本是一个服务报错,解决就行了对不对.后来我各种搜索大法发现了一个常识错误. 1.报错: 2.过程(赶时间的朋友 ...

  3. 【随记】WPF中xaml输入中文乱码问题解决

    在Visual Studio中开发WPF应用程序时,在XMAL文档编写界面输入中文时变为乱码.可能的原因之一是VS中安装了VAssistX插件,导致编码冲突,使中文输入乱码.解决方法是在VAssist ...

  4. 斐讯K2P通过配置文件开启telnet的原理分析

    看过几篇教程之后我已经知道怎么备份固件了.但是现在有一个问题,我的本意是把K2P原机带的固件备份出来,用教程上的方法进行开启telnet.备份固件等操作是否会改变固件呢?下面我们来验证这个问题. Op ...

  5. 根据浏览器判断是否为Android、ios或微信环境

    写h5页面时经常有业务逻辑需要判断页面所处的环境,这时我们可以通过navigator对象来获取浏览器相关信息加以判断,方法如下: let ua = navigator.userAgent; let i ...

  6. hasattr(object, name)

    查看object有没name属性 有返回True 没有返回 False

  7. java操作html格式数据

    近期在做数据抓取功能,抓取到的数据为html格式,需在后台进行转换后取值,为了避免使用字符串查找方式获取而使用Jsonp完美实现. 1. 引入Jsonp: <dependency> < ...

  8. AS添加依赖库提示Manifest merger failed解决办法

    今天在学习<Android权威编程指南>时 在project structure中添加recyclerview时提示错误 按照提示添加tools:replace标签还是报错 然后切换至bu ...

  9. R 安装包遇到问题(一) loadNamespace()里算'rJava'时.onLoad失败了 rJava 包的安装与载入

    > library(xlsx) Error: package or namespace load failed for ‘xlsx’: loadNamespace()里算'rJava'时.onL ...

  10. 封装通用的xhr对象(兼容各个版本)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...