@[lanhua_ma](/user/145225)
一般来说,01背包和完全背包的区别在于第二层循环的正序和倒序
```cpp
for(int i=1;i<=m;i++)
for(int j=t;j>0;j--)
if(sj[i]<=j)dp[i][j]=max(dp[i-1][j],dp[i-1][j-sj[i]]+jz[i]);
else dp[i][j]=dp[i-1][j];
```
当然,这个代码可以压维和常数优化:
```cpp
for(int i=1;i<=m;i++)
for(int j=t;j>=sj[i];j--)
dp[j]=max(dp[j],dp[j-sj[i]]+jz[i]);
```
题解区第一篇讲的挺好,~~你的原码好像是完全背包~~
by Zvelig1205 @ 2021-08-10 12:15:08
@[lanhua_ma](/user/145225)
```cpp
for (int j = c[i]; j <= t; j++) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - c[i]] + w[i]);
}
```
如果这么写的话
dp[i][j] = 0 (0 <= j < c[i])
```cpp
for (int j = 1; j <= t; j++) {
dp[i][j] = dp[i - 1][j];
if (j >= c[i])
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - c[i]] + w[i]);
}
```
根据题解这么写的话
dp[i][j] = dp[i - 1][j] (0 <= j < c[i])
其实就是多了一些初始化
~~话说好久没看见和我码风一样的了~~
by _NTT_ @ 2021-08-10 12:17:03
@[极冬寒雪](/user/413020) 但是不压维的话好像正序和倒序都是一样的吧
by _NTT_ @ 2021-08-10 12:24:53
@[极冬寒雪](/user/413020) @[少年先疯队](/user/397282) 手推之后感觉背包九讲的伪代码应该是有 bug 的, 没有压维之前必须要从 1 开始循环. 谢谢两位大佬帮助!
by lanhua_ma @ 2021-08-10 12:48:19
@[lanhua_ma](/user/145225) 没关系
by _NTT_ @ 2021-08-10 14:24:59