替换图片链接
This commit is contained in:
@@ -163,7 +163,7 @@ if (abs(target) > sum) return 0; // 此时没有方案
|
||||
|
||||
先只考虑物品0,如图:
|
||||
|
||||

|
||||

|
||||
|
||||
(这里的所有物品,都是题目中的数字1)。
|
||||
|
||||
@@ -177,7 +177,7 @@ if (abs(target) > sum) return 0; // 此时没有方案
|
||||
|
||||
接下来 考虑 物品0 和 物品1,如图:
|
||||
|
||||

|
||||

|
||||
|
||||
装满背包容量为0 的方法个数是1,即 放0件物品。
|
||||
|
||||
@@ -191,7 +191,7 @@ if (abs(target) > sum) return 0; // 此时没有方案
|
||||
|
||||
接下来 考虑 物品0 、物品1 和 物品2 ,如图:
|
||||
|
||||

|
||||

|
||||
|
||||
装满背包容量为0 的方法个数是1,即 放0件物品。
|
||||
|
||||
@@ -207,17 +207,17 @@ if (abs(target) > sum) return 0; // 此时没有方案
|
||||
|
||||
如图红色部分:
|
||||
|
||||

|
||||

|
||||
|
||||
dp[2][2] = 3,即 放物品0 和 放物品1、放物品0 和 物品 2、放物品1 和 物品2, 如图所示,三种方法:
|
||||
|
||||

|
||||

|
||||
|
||||
**容量为2 的背包,如果不放 物品2 有几种方法呢**?
|
||||
|
||||
有 dp[1][2] 种方法,即 背包容量为2,只考虑物品0 和 物品1 ,有 dp[1][2] 种方法,如图:
|
||||
|
||||

|
||||

|
||||
|
||||
**容量为2 的背包, 如果放 物品2 有几种方法呢**?
|
||||
|
||||
@@ -229,7 +229,7 @@ dp[2][2] = 3,即 放物品0 和 放物品1、放物品0 和 物品 2、放物
|
||||
|
||||
如图:
|
||||
|
||||

|
||||

|
||||
|
||||
有录友可能疑惑,这里计算的是放满 容量为2的背包 有几种方法,那物品2去哪了?
|
||||
|
||||
@@ -239,7 +239,7 @@ dp[2][2] = 容量为2的背包不放物品2有几种方法 + 容量为2的背包
|
||||
|
||||
所以 dp[2][2] = dp[1][2] + dp[1][1] ,如图:
|
||||
|
||||

|
||||

|
||||
|
||||
以上过程,抽象化如下:
|
||||
|
||||
@@ -266,11 +266,11 @@ else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];
|
||||
|
||||
先明确递推的方向,如图,求解 dp[2][2] 是由 上方和左上方推出。
|
||||
|
||||

|
||||

|
||||
|
||||
那么二维数组的最上行 和 最左列一定要初始化,这是递推公式推导的基础,如图红色部分:
|
||||
|
||||

|
||||

|
||||
|
||||
关于dp[0][0]的值,在上面的递推公式讲解中已经讲过,装满背包容量为0 的方法数量是1,即 放0件物品。
|
||||
|
||||
@@ -323,7 +323,7 @@ for (int i = 0; i < nums.size(); i++) {
|
||||
|
||||
例如下图,如果上方没数值,左上方没数值,就无法推出 dp[2][2]。
|
||||
|
||||

|
||||

|
||||
|
||||
那么是先 从上到下 ,再从左到右遍历,例如这样:
|
||||
|
||||
@@ -349,11 +349,11 @@ for (int j = 0; j <= bagSize; j++) { // 列,遍历背包
|
||||
|
||||
这里我再画图讲一下,以求dp[2][2]为例,当先从上到下,再从左到右遍历,矩阵是这样:
|
||||
|
||||

|
||||

|
||||
|
||||
当先从左到右,再从上到下遍历,矩阵是这样:
|
||||
|
||||

|
||||

|
||||
|
||||
这里大家可以看出,无论是以上哪种遍历,都不影响 dp[2][2]的求值,用来 推导 dp[2][2] 的数值都在。
|
||||
|
||||
@@ -366,7 +366,7 @@ bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4
|
||||
|
||||
dp数组状态变化如下:
|
||||
|
||||

|
||||

|
||||
|
||||
这么大的矩阵,我们是可以自己手动模拟出来的。
|
||||
|
||||
@@ -445,7 +445,7 @@ bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4
|
||||
|
||||
dp数组状态变化如下:
|
||||
|
||||

|
||||

|
||||
|
||||
大家可以和 二维dp数组的打印结果做一下对比。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user