关于01背包与完全背包的优化的理解

我目前的水平还做不到从理论上分析,只能从现象出发来说明可行性。

01背包

优化前

for (int i = 0; i <= N; ++i){
	for (int j = 0; j <= V; ++j){
		dp[i][j] = dp[i - 1][j];
		if (w[i] > j)	dp[i][j] = max(dp[i][j], dp[i - 1][j - w[i]] + v[i]);
	}
}

优化后

for (int i = 0; i <= N; ++i){
	for (int j = V; j >= w[i]; --j){
		dp[j] = max(dp[j], dp[j - w[j]] + v[j]);
	}
}

完全背包

优化前

for (int i = 0; i <= N; ++i){
	for (int j = 0; j <= V; ++j){
		dp[i][j] = dp[i - 1][j];
		if (w[i] > j)	dp[i][j] = max(dp[i][j], dp[i][j - w[i]] + v[i]);
	}
}

优化后

for (int i = 0; i <= N; ++i){
	for (int j = v[i]; j <= V; ++j){
		dp[j] = max(dp[j], dp[j - w[j]] + v[j]);
	}
}

用excel模拟可以发现,01背包优化后的代码在计算max时,比较的是当前值上一行,前一列的值,这和二维的01背包是等效的,于是可以这样优化。
同理,完全背包优化后的代码在计算max时,比较的是当前值这一行,前一列的值,这和二维的完全背包也是等效的,于是可以这样优化。

posted @ 2021-11-15 09:23  tsrigo  阅读(38)  评论(0编辑  收藏  举报