一.01背包和完全背包的正序逆序问题:
-
背包问题图示基本如下:
-
因此可得01背包有两种写法:
-
写法1:f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);
-
写法2:f[j] = max(f[j], f[j - w] + v);
-
-
01背包中,第i件物品的价值和i - 1息息相关,如果是二维写法,有i做控制作用显然没问题,但是如果是一维写法,因为j表示的容量,无i的限制。
-
因此求解f[j]时,本来应该用i - 1进行更新,此时却用i来进行更新,而且正序枚举的话 f[j - v] 已经被算过,会产生影响,所以不行,而逆序则不会产生这个问题
-
完全背包中:物品个数无限制,前i次物品所带来的价值不止是取或者不取第i-1件物品,也可以取第i件物品,这就导致第i件物品带来的价值有三种可能,取第i-1件物品,不取第i-1件物品,取第i件物品,所以需要顺序。