【题解】洛谷P1273 有线电视网(树上分组背包)
次元传送门:洛谷P1273
思路
一开始想的是普通树形DP 但是好像实现不大好
观摩了一下题解
是树上分组背包
设f[i][j]为以i为根的子树中取j个客户得到的总价值
我们可以以i为根有j组
在每一组中分别又取1个,2个,3个......n个客户
化为背包思想即 j为一共有j组 背包容量为每组的客户数总和 把该节点的每个儿子看成一组 每组中的元素为选一个,选两个...选n个用户
状态转移方程:
f[i][j]=max(f[i][j],f[i][j-k]+f[v][k]-边权);//i为根 j为容量
最后输出f[1][i]>=0的i的最大值 所以反向枚举
代码
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 3010
#define INF 1e9+7
int f[maxn][maxn];
int h[maxn],val[maxn];
int n,m,cnt;
struct Edge
{
int to;
int next;
int w;
}e[maxn*maxn];
void add(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].w=w;
e[cnt].next=h[u];
h[u]=cnt;
}
int dfs(int u)
{
if(u>n-m)//如果是叶子节点
{
f[u][]=val[u];//当前只能取一个客户 就是自己
return ;//返回几个客户
}
int t,sum=;//t为当前组有几个客户 sum为背包容量
for(int i=h[u];i;i=e[i].next)//枚举组
{
int v=e[i].to;
t=dfs(v);
sum+=t;
for(int j=sum;j>=;j--)//枚举容量 倒序
for(int k=;k<=t;k++)//枚举客户数量
{
if(j-k>=) f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]-e[i].w);
//满足背包容量大于客户数量才可以
}
}
return sum;
}
int main()
{
memset(f,~0x3f,sizeof(f));//初始化为一个极小负数 因为可能有负数
cin>>n>>m;
for(int i=;i<=n-m;i++)
{
int size;
cin>>size;
for(int j=;j<=size;j++)
{
int x,y;
cin>>x>>y;
add(i,x,y);
}
}
for(int i=n-m+;i<=n;i++) cin>>val[i];
for(int i=;i<=n;i++) f[i][]=;//初始化 取0个客户的花费为0
dfs();
for(int i=m;i>=;i--)//反向枚举
{
if(f[][i]>=)
{
cout<<i;
return ;
} }
}
https://www.luogu.org/problemnew/show/P1273
【题解】洛谷P1273 有线电视网(树上分组背包)的更多相关文章
- 洛谷P1273 有线电视网 (树上分组背包)
洛谷P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节 ...
- 洛谷P1273 有线电视网 树上分组背包DP
P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 ...
- 洛谷 P1273 有线电视网(树形背包)
洛谷 P1273 有线电视网(树形背包) 干透一道题 题面:洛谷 P1273 本质就是个背包.这道题dp有点奇怪,最终答案并不是dp值,而是最后遍历寻找那个合法且最优的\(i\)作为答案.dp值存的是 ...
- 洛谷 P1273 有线电视网
2016-05-31 13:25:45 题目链接: 洛谷 P1273 有线电视网 题目大意: 在一棵给定的带权树上取尽量多的叶子节点,使得sigma(val[选择的叶子节点])-sigma(cost[ ...
- C++ 洛谷 P1273 有线电视网 题解
P1273 有线电视网 很明显,这是一道树形DP(图都画出来了,还不明显吗?) 未做完,持续更新中…… #include<cstdio> #include<cstring> ...
- 洛谷——P1273 有线电视网
P1273 有线电视网 题目大意: 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树 ...
- 洛谷P1273 有线电视网 【树上分组背包】
题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...
- 洛谷 P1273 有线电视网 && caioj 1109 树形动态规划(TreeDP)4:比赛转播(树上分组背包总结)
从这篇博客往前到二叉苹果树都可以用分组背包做 这依赖性的问题,都可以用于这道题类似的方法来做 表示以i为根的树中取j个节点所能得的最大价值 那么每一个子树可以看成一个组,每个组里面取一个节点,两个节点 ...
- [洛谷P1273] 有线电视网
类型:树形背包 传送门:>Here< 题意:给出一棵树,根节点在转播足球赛,每个叶子节点是一个观众在收看.每个叶子结点到根节点的路径权值之和是该点转播的费用,每个叶子节点的观众都会付val ...
随机推荐
- JavaScript初学
今天学习了js的基础知识,自我归纳如下: 第一部分:js变量的声明和引入 js声明1-直接声明js代码块,使用<script></script> 2-引入外部声明,即创建一个 ...
- centos配置网络
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE="eth0"BOOTPROTO=&qu ...
- js获取上一页、当前页及域名url
一个业务中可能会用到,跳转到另个页面后, 又后退回之前的页面,之前的页面上有个判断提示一定会出 网上搬了下代码 console.log("js获取当前域名"+window.loca ...
- iphone崩溃日志分析工具symbolicatecrash用法
Symbolicatecrash是Xcode自带的一个分析工具,可以通过机器上的崩溃日志和应用的.dSYM文件定位发生崩溃的位置,把crash日志中的地址替换成代码相应位置. 使用效果: 分析前: T ...
- flask多线程多协程操作
local的作用:各个线程各开辟一块空间互不影响 基于local""" import threading from threading import local impo ...
- centos下运行python3.6+Django+mysql项目
文件准备: Django项目 myslq安装 关闭防火墙 用xshell拖拽到centos上 安装文件: 安装python3.6(3.7有问题) sh install_py36.sh 关闭防火墙 sh ...
- ML机器学习导论学习笔记
机器学习的定义: 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行为,以 ...
- 判断计算机是否可以ping通
#!/usr/bin/python # -*- coding: utf-8 -*- import os of = open('servers.txt','r') ofw=open('servers_p ...
- Compare DML To Both REDO And UNDO Size
SUMMARY you can remember undo rule the same to redo if you want demo rule that you can look up the ...
- 搭建spring boot+elasticsearch+activemq服务
目前时间是:2017-01-24 本文不涉及activemq的安装 需求 activemq实时传递数据至服务 elasticsearch做索引 对外开放查询接口 完成全文检索 环境 jdk:1.8 s ...