2024.9.27 计划

项目

暂时无

学习

总结

ROS进程通信第三种:参数服务器

类似于全局变量

有依赖的背包问题

主要是树形dp的思想,\(f[i][j]\) 表示的是在以i节点为根的子树中,选出体积不超过j的方案中的最大值
因为i节点是必须选上的,更新的思路就是先预留出i节点的空间,去枚举i节点的所有子节点,从里面挑出来最大的,然后选上i节点
因为树形dp无法用物品来枚举选法,所以以体积来划分选的方式:

for (int i = h[u]; ~i; i = ne[i]) {  // 枚举所有的子节点
	int son = e[i];
	dfs(son);
	
	for (int j = m - v[u]; j >= 0; j -- )  // 从大到小枚举是为了优化空间,这里上限是m - v[u]是因为要给u留出来位置
		for (int k = 0; k <= j; k ++ )  // 这里枚举从son为根的子树中所有的选法,体积上限最多到j,用来更新他的父节点u
			f[u][j] = max(f[u][j], f[u][j - k] + f[son][k]);  // 根节点是u,总体积不超过j = 根节点是u,总体积是j - k的 + 从根节点是son的子树里面选了k的
}

for (int j = m; j >= v[u]; j -- ) f[u][j] = f[u][j - v[u]] + w[u];  // 刚才更新的是没有选u的,也就是f[u][0].....f[u][m - v[u]]这种选u之前的状态
for (int j = v[u] - 1; j >= 0; j -- ) f[u][j] = 0;  // 体积不够选u的肯定不能选下面的节点,直接变为0即可
posted on 2024-09-27 13:57  Laurance  阅读(2)  评论(0编辑  收藏  举报