关于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时,比较的是当前值与这一行,前一列的值,这和二维的完全背包也是等效的,于是可以这样优化。