P1273 有线电视网 ( 树形dp -分组背包 )

[洛谷 P1273] 有线电视网 (树形分组背包) [洛谷 P1273] 有线电视网 题目链接 大致题意: n个节点,m个叶子节点,根节点为1号点,每一条边都有一个边权,代表花费,叶子节点具有点权,代表收益 问在总收益>=0的情况下,可以连通最多多少个叶子节点 如果我简化题意不是很清楚,请看原题意 解题思路: 这个题不是很好想,如果我们把每棵子树看作是一个分组,那么组内可以不选叶子节点,可以选一个,可以选两个… 也就是说,每一个组内最多只有一种决策,分组背包!! 分组背包的状态表示是前i个组中,选j个物品的最大收益 但是我们这是树形结构,要在加一 阅读详情
题目链接:点击进入
题目

在这里插入图片描述
在这里插入图片描述

思路

背包的总容量 = 该点子树中所有用户数量
组数 = 该点的子节点数
每组内的元素 = 该点子树中用户数的选择方案( 选 1 个用户、2 个用户、3 个用户… 个用户 )
每组内元素相互冲突
然后,模型就变成了分组背包
同时因为要求的是费用不亏本的情况下( 也就是总费用 >= 0 )的最大用户数,所以最后倒着枚举用户数看哪个费用大于等于 0 即可

代码
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
//#pragma GCC optimize(3)//O3
//#pragma GCC optimize(2)//O2
//#include<bits/stdc++.h>
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<bitset>
#include<fstream>
#define X first
#define Y second
#define best 131 
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define lowbit(x) x & -x
#define inf 0x3f3f3f3f
//#define max(a,b) a>b?a:b
//#define min(a,b) a<b?a:b
//#define int long long
//#define double long double
//#ifndef ONLINE_JUDGE  freopen("data.in.txt","r",stdin);
//freopen("data.out.txt","w",stdout); #endif //???t?áè? 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double pai=acos(-1.0);
const int Mod=998244353;
const double eps=1e-9;
const int N=26;
const int mod=1e8;
const int maxn=1e6+10;

/*--------------------------------------------*/ 
inline int read()
{
    int data=0,w=1; char ch=0;
    while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
    if(ch=='-') w=-1,ch=getchar();
    while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();
    return data*w;
}
/*--------------------------------------------*/

int n,m,a[maxn],sum[maxn],k;
int dp[3010][3010];//在以 i 为根的子树中,选择 j 个客户的需求所能获得的最大收益
int head[maxn],tot;
struct node
{
	int w;
	int to;
	int next;
}edge[maxn];
void init()
{
	memset(head,-1,sizeof(head));
	memset(dp,-0x3f,sizeof(dp));
	tot=0;
}
void add(int u,int v,int w)
{
	edge[tot].w=w;
	edge[tot].to=v;
	edge[tot].next=head[u];
	head[u]=tot++;
}

void dfs(int pos,int fa)
{
	if(pos>n-m)
	{
		dp[pos][1]=a[pos];
		sum[pos]=1;
		return ;
	}
	for(int i=head[pos];i!=-1;i=edge[i].next)//遍历每一组 
	{
		int v=edge[i].to;
		if(v==fa) continue;//因为是双向边,所以特判一下 
		dfs(v,pos);
		sum[pos]+=sum[v];//判断子树中有多少个用户 
		for(int j=sum[pos];j>=0;j--)//子树中用户数就是容量 
		{
			for(int k=1;k<=sum[v];k++)//每组元素,就是该子节点用户数分配方案 
			{
				if(j>=k)
					dp[pos][j]=max(dp[pos][j],dp[pos][j-k]+dp[v][k]-edge[i].w);
			}
		}
	}
}

int main()																						
{	
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	init();
	for(int i=1;i<=n-m;i++)
	{
		cin>>k;
		for(int j=1;j<=k;j++)
		{
			int v,w;
			cin>>v>>w;
			add(i,v,w);
			add(v,i,w);
		}
	}
	for(int i=n-m+1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
		dp[i][0]=0;
	dfs(1,-1);
	for(int i=m;i>=1;i--)
	{	
		if(dp[1][i]>=0)
		{
			cout<<i<<endl;
			return 0;
		}
	}
	return 0;
}
洛谷 P1273 有线电视网 P1273 有线电视网 //ans[i][j]表示第i个结点以下共j个用户观看时最大的赚钱量 //(仍然没有想到)ans[u][i]=max{ans[u][i-j]+ans[v][j]-w} //具体解释: /* ans[i][j][k]表示第i个结点以下前k个子结点中有j个用户观看时最大的赚钱量 ye[v]为v及以下叶节点数量 则对于边(u,v,w),ans[i][j][k]=max{ans 阅读详情

相关推荐

P1273 有线电视网(树形dp + 背包问题)

题目描述 某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。 从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费用总和。 现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定给哪些用户提供信号而不给哪些用户提供信号。 写一个程序找出一个方案使得有线电视网在不亏本的情况下使观看转播的用户尽可能多。 输入格式 输入文件的第一行包

five_east_west的博客 682

[洛谷-P1273]有线电视网(树形DP + 分组背包DP)

[洛谷-P1273]有线电视网(树形DP + 分组背包DP)

Turing_Sheep的博客 686

深入解析EXI协议在ISO15118-2命令测试中的编解码实践

本文深入探讨了EXI协议在ISO15118-2车桩通信标准中的关键作用与实践方法。EXI编解码测试是确保通信准确性与效率的核心环节,文章详细介绍了从搭建测试环境、选择工具库到编写完整测试代码的全过程,并分析了结果差异的常见原因与调试技巧,为电动汽车充电系统的开发者提供了实用的技术指南。

potato的博客 1048

P1273 有线电视网(树上背包)

P1273有线电视网https://www.luogu.com.cn/problem/P1273 很好的一题 #include <cstdio> #include <cstring> #include <string> #include <vector> #include <cmath> #include <queue> using namespace std; const int MAXN=1e6+10; using ll=..

Ghostttttttiii的博客 414

用GraphPad Prism直出单细胞亚群堆叠柱状图

用GraphPad Prism直出单细胞亚群堆叠柱状图

fivehuge的博客 4195

保姆级教程:用rosbag录制和回放你的第一个ROS机器人数据(附C++/Python代码)

本文提供了一份详细的ROS机器人数据录制与回放教程,涵盖从命令行操作到C++/Python编程实现的全流程。通过rosbag工具,开发者可以高效记录和回放机器人运行时的传感器数据和控制指令,适用于故障复现、算法调试等多种场景。教程还包含高级技巧如时间同步和大文件处理,帮助用户快速掌握ROS数据管理核心技能。

weixin_29313239的博客 283

P1273 有线电视网(树形dp 分组背包)

原题: https://www.luogu.org/problemnew/show/P1273 题意: 一棵树,节点1为根,边权为花费。到达一个叶子节点会得一分,并且还给你花费feeifee_ifeei​。问不花钱可以得到的最高分。 解析: 首先是树形dp,第二维因为得分和金额中,得分在值上比较小,所以dp[p][v]表示到点p(从下到上)得到v分的最大剩余金额。 显然,到每一个点,对于每个v都...

QAQ 456

自动驾驶仿真(五)—— 基于Carsim、Prescan、Simulink的联合仿真

自动驾驶仿真五——基于Carsim、Prescan、Simulink的联合仿真1. 联合仿真流程2. CarSim联合仿真配置要点3. Prescan联合仿真配置要点4. Carsim、Prescan、Simulink联合仿真结果5. 参考学习的书目教材 博主前面的博文已经介绍了Carsim和Prescan各自与Matlab/Simulink的相关联合仿真应用实例,并且论述过几款软件各自的优势及用法,CarSim适合动力学模型的建立,PreScan适合行车场景的搭建,Simulink适合控制算法的设计及信号

zhudj08的博客 1万+

[P1273] 有线电视网 (树形DP+分组背包)

题意:给出一棵树,有边权,只有叶子节点有点权,求一个合法方案(选择走到哪几个叶子节点,且路径上的权值和 <= 要走到的叶子节点的点权和),使得选择的叶子节点数量尽量的多; 解法:树形DP+分组背包; 1.树形DP;这是一棵树,所以叫树形DP; 2.分组背包;在这里主要是运用到了它的思想;我们可以设 f[i][j],表示 i节点选择了 j个叶子节点的费用最大值;假设现在在 x节...

Lucifer0708的博客 250

Synopsys SpyGlass 进行 RTL 功耗估计

通过上述脚本,您可以使用 Synopsys SpyGlass 对纯 RTL 代码和带有 FSDB 波形的 RTL 代码进行功耗估计,并支持将 SDC 文件转换为 SGDC 文件。

yumingqinglong的博客 2186

SAP ABAP 如何实现物料主数据接口的增量传输机制?

如何实现物料主数据接口的增量传输机制?我在各客户系统中看到了五花八门的实现方式,即使是 IBM 实施的开发质量也并没有保证。其实这是一个很简单的问题,下面以物料主数据接口为例子,介绍 SAP 中更改文档对象的接口数据增量传输机制。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 1316

洛谷 P1273 有线电视网(树形DP+分组背包)

任重而道远 题目描述 某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。 从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费用总和。 现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定给哪些用户提供信号而...

TRS_07170的博客 272

将Dify平台开发的工作流集成到Open WebUI中

将Dify开发的工作流集成到Open WebUI是一个能够显著增强AI应用交互能力和业务逻辑深度的有效途径。其核心在于通过API建立两者间的通信桥梁,并确保API在格式、协议和行为上的一致性,特别是向OpenAI Chat API规范看齐。最简单直接的路径是利用Dify的“对话型”或“Agent型”应用,这类应用的API设计更倾向于满足Open WebUI这类聊天前端的期望。然而,面对复杂的现实场景,直接的完美兼容并非总是唾手可得。

形上得其象,形下合于数;阴阳自济,玄理自明。 2030

洛谷 P1273 有线电视网 ( 树形dp+分组背包) 题解

题目来源: https://www.luogu.org/problemnew/show/P1273 题目描述: 题目描述 某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。 从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费...

摇摇乐的博客 306

Dify框架面试内容整理-如何优化Dify的应用性能?

为1536维)可选用 PCA、FAISS 的量化压缩方法降低维度(如128、256、512);对知识库预览、任务流配置等页面,使用 nginx/cache-control 减少请求。API 响应耗时(P50/P95)、Token 使用量、缓存命中率、向量检索耗时;对 Prompt+输入内容计算 Hash,缓存相同请求的返回结果;使用占位符 + 函数拼接,按需组合 Prompt,而非静态长模板;数据量大时,应在构建索引前清洗冗余段落、统一格式,避免重复向量。维度越低,检索越快,但可能影响召回准确度,需平衡。

不务正业的猿 1549

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

刷题笔记(总)

某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费用总和。现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定给哪些用户提供信号而不给哪些用户提供信号。写一个程序找出一个方案使得有线电视网在不亏本的情况下使观看转播的用户尽可能多。

GANIT的博客 862

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

9/6 分组背包+有依赖的背包+基环树

题意:物品被分为n个组,每组有s[i]个物品,组内各个物品可选可不选(0 or 1),要求在容量为V的情况下得到的价值最大是多少。

weixin_51934288的博客 311

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

P1273 有线电视网

P1273 有线电视网 就是一个树形分组背包模板。然后最后在、倒叙遍历一遍根节点的dp数组就可以了 #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> using std::max; const int maxn=3010; struct node { ...

weixin_34121282的博客 140

树形dp+树形结构总结

总结       最近写了好多树形dp+树形结构的题目,这些题目变化多样能与多种算法结合,但还是有好多规律可以找的。 树形dp一般都是用子树更新父亲(即从下向上更新),那么首先应该考虑的是一个一个子树的更新父亲还是把所有子树都算完了在更新父亲?这就要因题而异了,一般来说有两种情况:1.需要把所有子树的信息都掌握之后再更新子树的就需要把所有子树都算完了在更新父亲。2.而像树上背包这样的问题就需要

dcx2001的博客 3万+

P1273 有线电视网 题解

​树形结构处理​:使用DFS后序遍历树结构,确保子问题先求解​分组背包设计​:每个子节点作为一组物品,选择服务多少用户​状态转移​倒序枚举​:确保状态转移无后效性​初始化​:叶子节点特殊处理,非叶子节点初始化为服务0个用户。

tkwuhuacai的博客 722

有线电视网(洛谷-P1273)

这是本题最容易踩坑的地方,很多人习惯性地把 DP 数组全初始化为 0,在这道题里会导致严重的后果。定义 dp[u][j]:表示以 u 为根的子树中,恰好选择 j 个用户所能获得的最大利润。树上背包问题,代码框架非常固定。真正有难度的,是对物理意义的理解dp初始化是否淘汰了幽灵数据?内层循环k是否精准处理了“选与不选”产生的代价差异?

布心老混子 所有代码均老混子本人远古手搓 易错点均为学生真实场景 博客文章部分借助ai生成 568

P1273 有线电视网 (树上分组背包)

题解 dp[u][j]表示u的子树中选了j个终端的盈利。这里设v为u的子树。 状态转移: dp[u][j]=max{dp[v][k+t]-cost},和分组背包类似,把子树v看成一个组,然后从子树v中选t个物品。 这里要注意的是树形dp其实自动省略了一维i,本质上是dp[i][u][j],前i颗子树中第u个结点有j个物品的盈利。这里用dfs从下往上更新可以省略掉第一维,所以这里对状态更新的时候需要...

Link_Ray的博客 295

【LuoguP1273有线电视网】树形依赖背包

【LuoguP1273有线电视网】树形依赖背包 参考论文http://wenku.baidu.com/view/8ab3daef5ef7ba0d4a733b25.html 参考一篇写的很好的博文http://www.cnblogs.com/GXZC/archive/2013/01/13/2858649.html 题目链接http://www.l...

qq_25768269的博客 153

【动态规划2】树形背包DP

因为这个就像完全背包一样,如果你不倒序枚举的话,比如说dp[u][3]的转移是u保留1个叶子,v保留2个叶子,然后我现在要考虑dp[u][5]从dp[u][3]转移时,如果dp[u]5]这种情况下的最优抉择保留的还是u那边的那个叶子的话,那么这个叶子的权值就被dp[u][5]算了2遍,显然是错误的,所以我们就像背包一样,倒序枚举即可。设dp[u][j]表示以u为根的子树,保留j个叶子结点的情况下,最大的权值(这里指的是以u为根的子树权值,而不是整棵树的)n-1和n合并:1*1。n-2和n-1合并:1*2。

2509_93020071的博客 1066
上一篇: CodeForces - 1526C2 - Potions (Hard Version) ( 优先队列 + 贪心 )
下一篇: HDU - 1698 - Just a Hook( 线段树 )
Cosmic_Tree
博客等级 码龄7年 134粉丝 337原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值