求助: 用模版写 01 背包 40 分

P1048 [NOIP2005 普及组] 采药

@[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


|