题目链接:http://poj.org/problem?id=1155

题意:给定一棵树,1为根结点表示电视台,有m个叶子节点表示客户,有n-m-1个中间节点表示中转站,每条树边有权值。现在要在电视台播放一场比赛,每个客户愿意花费cost[i]的钱观看,而从电视台到每个客户也都有个费用,并且经过一条边只会产生一个费用。问电视台不亏损的情况最多有几个客户可以看到比赛?

思路:在树上的背包,具体看代码注释。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
const int maxn=3e3+;
const int INF=0x3f3f3f3f; struct Edge
{
int v;
int w;
int next;
} edge[maxn<<]; int dp[maxn][maxn];
int N,M;
int head[maxn];
int num[maxn],temp[maxn]; ///num数组是记录以当前节点为根节点的子树最多可以连多少个用户
int I; ///temp数组是为了维护当前状态,防止更新过程状态的变化影响结果 void init()
{
I=;
memset(head,-,sizeof(head));
} void addedge(int x,int y,int w)
{
edge[I].v=y;
edge[I].w=w;
edge[I].next=head[x];
head[x]=I++;
} void dfs(int u) /// 如果dp[0-N][0]=-INF 结果是WA的
{
///这个就是保证跟用户相连的时候第一个就算是负发也要选进来,其他的正数可以弥补。
if(u>N-M) return; ///否则求得的不是最优解
for(int i=head[u]; i!=-; i=edge[i].next)
{
int v=edge[i].v;
dfs(v);
for(int k=; k<=num[u]; k++)
temp[k]=dp[u][k];
for(int j=; j<=num[u]; j++)
for(int k=; k<=num[v]; k++)
dp[u][j+k]=max(dp[u][j+k],temp[j]+dp[v][k]-edge[i].w);
num[u]+=num[v];
}
} int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&N,&M)==)
{
init();
for(int i=; i<=N; i++) for(int j=; j<=N; j++) dp[i][j]=-INF;///初始化时候一定要注意!
memset(num,,sizeof(num));
for(int i=; i<=N-M; i++)
{
int n;
scanf("%d",&n);
while(n--)
{
int a,b;
scanf("%d%d",&a,&b);
addedge(i,a,b);
}
}
for(int i=N-M+; i<=N; i++)
{
scanf("%d",&dp[i][]);
num[i]=;
}
dfs();
for(int i=M; i>=; i--)
{
if(dp[][i]>=)
{
printf("%d\n",i);
break;
}
}
}
return ;
}

poj1155 TELE (树上的背包)的更多相关文章

  1. poj1155 TELE (树上分组背包)

    题目链接:https://vjudge.net/problem/POJ-1155 题意:给定一颗以1为根的边权树,有n个结点,其中m个叶子结点,每个叶子结点有一个价值.要求从m个叶子结点中选最多的结点 ...

  2. [POJ1155]TELE

    [POJ1155]TELE 试题描述 A TV-network plans to broadcast an important football match. Their network of tra ...

  3. hdoj1011(树上分组背包)

    题目链接:https://vjudge.net/problem/HDU-1011 题意:给定一颗树,每个结点有两个属性,即花费V和价值w,并且选择子结点时必须选择父结点,求总花费不超过m的最大价值. ...

  4. Gym - 101002D:Programming Team (01分数规划+树上依赖背包)

    题意:给定一棵大小为N的点权树(si,pi),现在让你选敲好K个点,需要满足如果如果u被选了,那么fa[u]一定被选,现在要求他们的平均值(pi之和/si之和)最大. 思路:均值最大,显然需要01分数 ...

  5. 【题解】洛谷P1273 有线电视网(树上分组背包)

    次元传送门:洛谷P1273 思路 一开始想的是普通树形DP 但是好像实现不大好 观摩了一下题解 是树上分组背包 设f[i][j]为以i为根的子树中取j个客户得到的总价值 我们可以以i为根有j组 在每一 ...

  6. 洛谷P1273 有线电视网 树上分组背包DP

    P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 ...

  7. [BZOJ4182]Shopping (点分治+树上多重背包+单调队列优化)

    [BZOJ4182]Shopping (点分治+树上多重背包+单调队列优化) 题面 马上就是小苗的生日了,为了给小苗准备礼物,小葱兴冲冲地来到了商店街.商店街有n个商店,并且它们之间的道路构成了一颗树 ...

  8. [POJ1155]TELE(树形背包dp)

    看到这道题的第一眼我把题目看成了TLE 哦那不是重点 这道题是树形背包dp的经典例题 题目描述(大概的): 给你一棵树,每条边有一个cost,每个叶节点有一个earn 要求在earn的和大于等于cos ...

  9. POJ-1155 TELE (树形DP+分组背包)

    题目大意:给一棵带边权的有根树,每个叶子节点有权.边权表示代价,叶子节点的权值代表可以补偿多少代价.问从根节点最多可以到达多少个叶子,使得付出的总代价不大于0. 题目分析:定义状态dp(u,k)表示从 ...

随机推荐

  1. 12.3 Arithmetic-software-

    一.流程图: 二.软件功能: 分为混合模式和单则模式,混合模式生成指定题数的任意四则混合运算,数字是1-10之间随机:单则模式是生成指定题数的加减乘除中指定的某一则运算,数字是1-10之间随机. 用户 ...

  2. c# 程序设计教程笔记

    值类型:[简单类型[整数类型(sbyte,byte,short,ushort,int uint,long....),字符类型),布尔类型,实数类型],结构类型, 枚举类型]. 引用类型:[类,委托,数 ...

  3. JavaScript写在Html页面的<head></head>中

    JavaScript写在Html页面的<head></head>中 ----------------- <html> <head> <style ...

  4. CFBundleVersion与CFBundleShortVersionString,上架注意事项

    CFBundleVersion,标识(发布或未发布)的内部版本号.这是一个单调增加的字符串,包括一个或多个时期分隔的整数. CFBundleShortVersionString  标识应用程序的发布版 ...

  5. 加载plist文件数据的方法

    这个pilist文件最外面的是一个数组,数组中每一个item是一个字典,我们的目的就是为了取到每一个item字典中的内容数据 下面看代码举例 //加载数组 - (void)handleData { / ...

  6. R的卸载和更新安装

      R包经常会遇到各种版本不兼容的毛病,比如当前的版本相较于包,新了/旧了都是麻烦 而升级R软件呢,最麻烦的就是之前安装的包怎么办? 搜罗了以下几种方法:   方法1: (1)直接安装新版本 (2)然 ...

  7. 【piu~】制作一只变形小鸡~

    在http://codepen.io/pick上看到的,,,具体是谁忘了,反正我只截了最萌的一段,作者越改越不萌ಥ_ಥ 谷哥哥随便一搜就有很多好玩的,度娘就...(  ̄ ▽ ̄)o╭╯☆#╰ _─﹏─) ...

  8. U盘安装Windows 7 + Ubuntu 14 双系统笔记

    第一个系统是Windows 7系统,现在采用U盘安装 Ubuntu 14,实现双系统,主要会用到3个软件: 1.DiskGenius - 磁盘修复.分区.调整分区工具,点击下载: 用这个工具先腾出一个 ...

  9. 【ASP.NET】利用Nuget打包package——GUI方式

    GUI方式 通过GUI的方式,可以下载如下的软件 NuGetPackageExplorer   打包dll 1.打开软件,在Package Content处点击右键 ,选择Add Lib 2.在lib ...

  10. Socket通信(二)

    程序下载地址: http://download.csdn.net/detail/u010312811/9683748 1.基本流程 服务器:(1)用指定的端口号和服务器的IP建立一个EndPoint对 ...