求助树上 dp 第二维枚举顺序
  • 板块学术版
  • 楼主Regain
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/6/28 09:53
  • 上次更新2023/11/3 12:16:15
查看原帖
求助树上 dp 第二维枚举顺序
643962
Regain楼主2023/6/28 09:53

树上 dp 典题:

有一棵 nn 个点,n−1n-1 条边的树,每个节点有重量 wiw_i 和价值 viv_i,背包重量为 mm,求总重量不超过 mm 的情况下,最大的价值。一个节点可以选,当且仅当它的父节点被选中。

n,m≤2000n,m \le 2000

写了一个 O(nm2)O(nm^2) 的暴力 dp,但是有个问题:

(dpi,j\text{dp}_{i,j} 表示以 ii 为根的子树中当前背包容量为 jj 时的最大价值)。

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 一行中,为什么背包的容量只能倒序枚举,而不能正序枚举。

如需要完整代码见此。

如有解答请 @ 我,谢谢大家。

2023/6/28 09:53
加载中...