首页 > 其他分享 >[树上背包浅谈]

[树上背包浅谈]

时间:2024-03-29 17:35:39浏览次数:13  
标签:cnt 背包 浅谈 int head edge maxn 树上 dp

树上背包

在这个树中选取一定数量的点或边(也可能是其他属性),使得某种与点权或者边权相关的花费最大或者最小。解决这类问题,一般要考虑使用树上背包。

dp[i][j]表示在以i为根的树中选择j个结点所获得的最大值/最小值

有线电视网

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 3005;
int n,m,cost[maxn];
int head[maxn],cnt;
int dp[maxn][maxn];
struct Edge{
	int to,len,next;
}edge[maxn];

void add(int u,int v,int w)
{
	cnt ++;
	edge[cnt].to = v;
	edge[cnt].len = w;
	edge[cnt].next = head[u];
	head[u] = cnt;
	return ;
}

int dfs(int u)//dfs返回的是以u为根节点的树,所包含的叶子结点数
{
	if(u > n-m) return 1;//说明到了叶子结点
	int num = 0;
	for(int i=head[u];i;i=edge[i].next)
	{
		int v = edge[i].to;
		int nv = dfs(v);
		num += nv;
		for(int j=num;j>=0;j--)//类似滚动数组的思想,j要倒着写,这样j是不断变小的,如果j先更新小的,那么大的会被更新过的dp[u][j-k]更新,这是错误的
			for(int k=0;k<=min(nv,j);k++)
				dp[u][j] = max(dp[u][j],dp[u][j-k]+dp[v][k]-edge[i].len);
	}
	return num;
} 

int main()
{
	memset(dp,128,sizeof(dp));//求最大值故初始化为最小
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n-m;i++)
	{
		int num;
		scanf("%d",&num);
		for(int j=1;j<=num;j++)
		{
			int a,c;
			scanf("%d%d",&a,&c);
			add(i,a,c);
		}
	}
	for(int i=n-m+1;i<=n;i++)
	{
		scanf("%d",&cost[i]);
		dp[i][1] = cost[i];//叶子节点选择自己的值
	}
	for(int i=1;i<=n;i++) dp[i][0] = 0;//所有节点在不选择任何节点的情况下都是0
	dfs(1);
	for(int i=m;i>=0;i--)
	{
		if(dp[1][i] >= 0)
		{
			printf("%d",i);
			break;
		}
	}
	return 0;
}

标签:cnt,背包,浅谈,int,head,edge,maxn,树上,dp
From: https://www.cnblogs.com/-Wind-/p/18104244

相关文章

  • 浅谈循环依赖
    说明循环依赖是一个大家讨论很多的话题,它更多是一个工程上的问题而不是技术问题,我们需要首先有一定的认知:如同两个人相互帮忙,两个类之间你调用我的,我调用你的是很正常也很自然的需求模型。单一依赖确实有好处,改动一个最顶层类时不需要在意对底部类的影响,但是从本来就自然的......
  • 背包问题 0-1背包 完全背包
    区分统一背包问题都先遍历物品(物品重量)再遍历背包(背包大小)0-1背包问题遍历背包时逆序,完全背包问题遍历背包时正序求最大价值,dp初始值就小点(一般0就行),求最小价值,dp初始值就大点(找个数Interger最大值或者背包大小+1W这种)0-1背包是一个背包里每个物品最多能放一次......
  • 动态规划 选择dp:多重背包+多重背包puls----中专生刷算法
    不了解动态规划和选择dp的同学先看一下这两篇文章动态规划:选择dp及优化01背包问题-CSDN博客动态规划:完全背包问题----中专生刷算法-CSDN博客然后我们来做题普通题+进阶题,图文详解,化零为整的解决多重背包puls问题!!!多重背包输入格式输出格式输出一个整数,表示最......
  • 浅谈数据治理之道 数据运用(四)
    前面我们谈到了数据分析,数据运用是数据分析的延伸,是将分析得出的洞见转化为实际行动的过程。那么我们需要进一步的将分析出来的数据进行运用,这也是非常关键的一个动作,也是数据价值所在。只有用数据来发现和解决问题,数据就变得非常有用了。那么面对从海量数据中提取价值、确保......
  • 浅谈WPF之属性系统
    在WPF开发中,经常听到各种属性,如:依赖属性,附加属性,CLR属性,那这些不同类型的属性,具体又有什么作用呢?今天以一些简单的小例子,简述一下WPF开发中,各种属性的相关概念和应用,仅供学习分享使用,如有不足之处,还请指正。 CLR属性 CLR属性(CommonLanguageRuntime),又称为.Net标准属性,是......
  • 浅谈C# Linq里的FirstOrDefault,First,Single,SingleOrDefault 方法
    FirstOrDefault:返回第一个元素,如果为空,则返回类型的默认值;数值类型默认值是0,引用类型默认值是NULL,布尔类型默认值是FalseFirst:也是返回第一个元素,但是如果为空的话,会抛出异常!!Single:返回唯一一个符合条件的元素,如若没有或者有多条,都会抛出异常!SingleOrDefault:返回唯一一个......
  • 2024-03-27:用go语言,多维费用背包。 给你一个二进制字符串数组 strs 和两个整数 m 和 n
    2024-03-27:用go语言,多维费用背包。给你一个二进制字符串数组strs和两个整数m和n,请你找出并返回strs的最大子集的长度,该子集中最多有m个0和n个1。如果x的所有元素也是y的元素,集合x是集合y的子集。输入:strs=["10","0001","111001","1","0"],m=......
  • [docker] 浅谈Docker:网络模式及从容器内部访问宿主机的IP地址
    0序本文系转载参考文献,属于非原创的笔记类博文。最新结论:从Docker容器内部访问宿主的IP地址的几种方法,推荐基于Bridge模式+--link访问别的服务+172.16.0.1(访问宿主机)。1Docker的网络模式docker是比较流行的容器技术,docker镜像方便程序员对应用统一的要求,打包部......
  • [docker] 浅谈Docker:Docker容器中环境变量的应用
    0序1设置环境变量1.1场景:在Dockerfile中设置环境变量在构建Docker镜像时,可以在Dockerfile中使用ENV指令来设置环境变量ENVMY_ENV_VAR="ABC123"ENV指令用于设置环境变量,语法为ENV<key><value>ENV<key>=<value>1.2场景:使用dockerrun命令设置环境变量使用d......
  • 浅谈如何阅读和编写mib文件
    MIB(ManageInformationBase)管理信息库,它是网络管理数据的标准,这个标准里规定了网络代理设备必须保存的数据项目,数据类型,以及允许在每个数据项目中的操作。通过对这些数据项目的存取访问,就可以得到改网关的统计内容。再通过对多个网关统计内容的综合分析即可实现基本的网络管......