动态规划求解大桶最大装液量 代码运行返回0问题求助
问题分析
你遇到的问题属于经典的01背包问题,每个小桶的液体对应重量和价值相等的物品,大桶容量对应背包限重,目标是求不超过容量的最大可装价值。你当前代码返回0是因为状态转移逻辑存在多处错误,具体问题如下:
- 状态转移逻辑不符合01背包规则:01背包针对第j个物品、容量为i的场景,核心判断是「选不选当前物品」,正确的转移公式是:
你写的多个if判断逻辑混乱,后面的赋值会覆盖前面的结果,完全没有实现正确的转移逻辑。当i < V[j]时:无法选当前物品,cache[i][j] = cache[i][j-1] 当i >= V[j]时:取「不选当前物品的最大值」和「选当前物品的最大值」的较大值,即cache[i][j] = max(cache[i][j-1], cache[i - V[j]][j-1] + V[j]) - 返回值索引错误:大桶容量是
barrel,应该取cache[barrel][V.length - 1],你错误使用了barrel-1作为第一维索引。 - 额外逻辑冗余:你在数组前补0的操作是可行的,但没必要额外判断
i == V[j]这类场景,正确的转移逻辑已经覆盖了这些情况。
修正后代码
let V1 = [2, 3, 4, 2]; let barrel = 100; function findMaxDP(V, capacity) { // 初始化缓存数组,cache[i][j]表示前j个物品,容量为i时的最大装量 const cache = Array.from({length: capacity + 1}, () => new Array(V.length + 1).fill(0)); for (let i = 1; i <= capacity; i++) { for (let j = 1; j <= V.length; j++) { const currVol = V[j-1]; // 不选当前物品的最大值 const noSelect = cache[i][j-1]; if (i < currVol) { cache[i][j] = noSelect; } else { // 选当前物品的最大值 const select = cache[i - currVol][j-1] + currVol; cache[i][j] = Math.max(noSelect, select); } } } return cache[capacity][V.length]; } console.log(findMaxDP(V1, barrel)); // 输出11,也就是所有小桶液体的总和,因为11 < 100
补充说明
如果测试时把大桶容量改成比如5,输出结果会是5(2+3),符合预期。
内容的提问来源于stack exchange,提问作者Pravin Poudel
相关产品推荐
相关产品推荐

