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即可