不放i,就是dp[i][j] = dp[i - 1][j]
    放i,就是 dp[i][j] = dp[i - 1][j - weight[i]] + value[i]

    dp[i][j] = max(
    dp[i - 1][j],
    dp[i - 1][j - weight[i]] + value[i]
    )

    全部 dp[i][0] =0;
    各种背包 全部j 放不放0物品时的价值最大值 肯定放最大
    for (int j = weight[0]; j <= bagWeight; j++) {
    dp[0][j] = value[0];
    }
    image.png

    // weight数组的大小 就是物品个数
    for(int i = 1; i < weight.size(); i++) { // 遍历物品
    for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量
    if (j < weight[i]) dp[i][j] = dp[i - 1][j]; // 这个是为了展现dp数组里元素的变化
    else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
    }
    }

    或者先遍历背包
    // weight数组的大小 就是物品个数
    for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量
    for(int i = 1; i < weight.size(); i++) { // 遍历物品
    if (j < weight[i]) dp[i][j] = dp[i - 1][j];
    else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
    }
    }

    虽然两个for循环遍历的次序不同,但是dp[i][j]所需要的数据就是左上角

    dp[i][j] = max(
    dp[i - 1][j],
    dp[i - 1][j - weight[i]] + value[i]
    );

    dp[j] 可以通过 dp[j - weight[i]] 得到
    即容量转移,转移前已经最大,转移后只要加上i 的价值即可

    也可以不取i,那么最大值就是保持上一个物品下的最大值
    dp[j] = max(
    dp[j],
    dp[j - weight[i]] + value[i]
    );

    先遍历物品嵌套遍历背包容量

    01背包问的是,装满背包时,最大价值是多少
    能不能装满?
    能装的最大价值,尽量装但不一定满
    有多少种方式能装满背包?

    装满容量j,最大价值为 dpj
    装满容量j,方法一共有dpj

    完全背包