警示后人
查看原帖
警示后人
890321
mooktian楼主2024/5/8 10:26

这题其实可以有两个思路,一眼看过去这就是个01背包。

但是在设计dp数组的时候,我们可以有两个考虑:

  1. 设 dp[j]dp[j] 为搬运体积jj 时所花费的最小体力,思路是没有问题的这里有个坑点,平常习惯了下面的写法
for(int j = v;j >= vi;j--) {
		f[j] = min(f[j],f[j-vi] + wi);
	}

但是这样写有个问题,当 jj 小于 vivi 时状态是没有更新的,最后会 WAWA。

正确的写法是:

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);
	}
  1. 第二种思路是设 f[j]f[j] 为花费体力 jj 时所能搬运的最大体积,这个题解里很多都是这么设计的,就不展开了。
2024/5/8 10:26
加载中...