poj1155 TELE (树上的背包)
题目链接: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 (树上的背包)的更多相关文章
- poj1155 TELE (树上分组背包)
题目链接:https://vjudge.net/problem/POJ-1155 题意:给定一颗以1为根的边权树,有n个结点,其中m个叶子结点,每个叶子结点有一个价值.要求从m个叶子结点中选最多的结点 ...
- [POJ1155]TELE
[POJ1155]TELE 试题描述 A TV-network plans to broadcast an important football match. Their network of tra ...
- hdoj1011(树上分组背包)
题目链接:https://vjudge.net/problem/HDU-1011 题意:给定一颗树,每个结点有两个属性,即花费V和价值w,并且选择子结点时必须选择父结点,求总花费不超过m的最大价值. ...
- Gym - 101002D:Programming Team (01分数规划+树上依赖背包)
题意:给定一棵大小为N的点权树(si,pi),现在让你选敲好K个点,需要满足如果如果u被选了,那么fa[u]一定被选,现在要求他们的平均值(pi之和/si之和)最大. 思路:均值最大,显然需要01分数 ...
- 【题解】洛谷P1273 有线电视网(树上分组背包)
次元传送门:洛谷P1273 思路 一开始想的是普通树形DP 但是好像实现不大好 观摩了一下题解 是树上分组背包 设f[i][j]为以i为根的子树中取j个客户得到的总价值 我们可以以i为根有j组 在每一 ...
- 洛谷P1273 有线电视网 树上分组背包DP
P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 ...
- [BZOJ4182]Shopping (点分治+树上多重背包+单调队列优化)
[BZOJ4182]Shopping (点分治+树上多重背包+单调队列优化) 题面 马上就是小苗的生日了,为了给小苗准备礼物,小葱兴冲冲地来到了商店街.商店街有n个商店,并且它们之间的道路构成了一颗树 ...
- [POJ1155]TELE(树形背包dp)
看到这道题的第一眼我把题目看成了TLE 哦那不是重点 这道题是树形背包dp的经典例题 题目描述(大概的): 给你一棵树,每条边有一个cost,每个叶节点有一个earn 要求在earn的和大于等于cos ...
- POJ-1155 TELE (树形DP+分组背包)
题目大意:给一棵带边权的有根树,每个叶子节点有权.边权表示代价,叶子节点的权值代表可以补偿多少代价.问从根节点最多可以到达多少个叶子,使得付出的总代价不大于0. 题目分析:定义状态dp(u,k)表示从 ...
随机推荐
- js 时间操作和随机数操作
function Data() { var date = new Date(); var year = date.getFullYear(); ; var strDate = date.getDate ...
- 1 云计算系列之云计算概述和KVM虚拟化简介
为什么会出现云之传统数据中学面临的问题 物理服务器的利用率非常低,浪费资源,且资源分配不合理,比如一台服务器CPU使用率不到40%,或者某个应用需要的硬件配置低但是服务器硬件配置高等等. 云计算概念 ...
- 100_1小记ressons analysis
想到一首诗用以自勉: look to the master, follow the master, walk with the master, see through the master, beco ...
- log4Net控制台输出
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
- cURL函数
PHP的cURL函数是通过libcurl库与服务器使用各种类型的协议进行连接和通信的,curl目前支持HTTP GET .HTTP POST .HTTPS认证.FTP上传.HTTP基于表单的上传.co ...
- MSYS2的源配置
关于MSYS2的文章可以参考下面的链接,笔者不多赘述: msys2安装笔记 MSYS2 + MinGW-w64 + Git + gVim 环境配置 msys2环境搭建 msys2安装g++: pacm ...
- Linux/CentOS下开启MySQL远程连接,远程管理数据库
当服务器没有运行PHP.没装phpMyAdmin的时候,远程管理MySQL就显得有必要了. 第一步:开启MySQL用户的远程访问权限 mysql -u root -p mysql # 第1个mysql ...
- js导出表格数据
考虑到浏览器兼容性问题,采用原生js和后台交互下载网页数据 js: var table = $('.table-panel table'); // Header var tdData ="& ...
- Extjs 制作柱状图
在JSP页面制作柱状图,可以根据数据的变化动态实时的变化 主要是使用EXTJS自带的插件达到效果 Ext.require('Ext.chart.*'); Ext.require([ 'Ext.Wind ...
- composer 安装提示 PHP Warning: readfile(): SSL operation failed with code 1
这是php设置openssl 没有指定cacert.pem (证书) 第一步:下载 cacert.pem 文件下载地址 https://curl.haxx.se/docs/caextract.html ...