这题其实可以有两个思路,一眼看过去这就是个01背包。
但是在设计dp数组的时候,我们可以有两个考虑:
- 设 dp[j] 为搬运体积j 时所花费的最小体力,思路是没有问题的这里有个坑点,平常习惯了下面的写法
for(int j = v;j >= vi;j--) {
f[j] = min(f[j],f[j-vi] + wi);
}
但是这样写有个问题,当 j 小于 vi 时状态是没有更新的,最后会 WA。
正确的写法是:
for(int j = v;j >= 0;j--) {
if(j >= vi) f[j] = min(f[j],f[j-vi] + wi);
else f[j] = min(f[j],wi);
}
- 第二种思路是设 f[j] 为花费体力 j 时所能搬运的最大体积,这个题解里很多都是这么设计的,就不展开了。