社区讨论

求助树上 dp 第二维枚举顺序

学术版参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo2dotdy
此快照首次捕获于
2023/10/23 12:09
2 年前
此快照最后确认于
2023/11/03 12:16
2 年前
查看原帖
树上 dp 典题:
有一棵 nn 个点,n1n-1 条边的树,每个节点有重量 wiw_i 和价值 viv_i,背包重量为 mm,求总重量不超过 mm 的情况下,最大的价值。一个节点可以选,当且仅当它的父节点被选中。
n,m2000n,m \le 2000
写了一个 O(nm2)O(nm^2) 的暴力 dp,但是有个问题:
dpi,j\text{dp}_{i,j} 表示以 ii 为根的子树中当前背包容量为 jj 时的最大价值)。
CPP
void dfs(int u, int fa) {
	F(i,w[u],m) dp[u][i]=v[u];
	forGraph(u){
		int t=G[i].to;
		if(t==fa) continue;
		dfs(t,u);
		for(int j=m; j>=w[u]; j--) { // here
			for(int k=0; k<=j-w[u]; k++){
				dp[u][j] = max(dp[u][j], dp[u][j-k]+dp[t][k]);
			}
		}
	}
}
here 一行中,为什么背包的容量只能倒序枚举,而不能正序枚举。
如需要完整代码见此
如有解答请 @ 我,谢谢大家。

回复

5 条回复,欢迎继续交流。

正在加载回复...