You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态规划求解大桶最大装液量 代码运行返回0问题求助

问题分析

你遇到的问题属于经典的01背包问题,每个小桶的液体对应重量和价值相等的物品,大桶容量对应背包限重,目标是求不超过容量的最大可装价值。你当前代码返回0是因为状态转移逻辑存在多处错误,具体问题如下:

  • 状态转移逻辑不符合01背包规则:01背包针对第j个物品、容量为i的场景,核心判断是「选不选当前物品」,正确的转移公式是:
    当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])
    
    你写的多个if判断逻辑混乱,后面的赋值会覆盖前面的结果,完全没有实现正确的转移逻辑。
  • 返回值索引错误:大桶容量是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:06:06