首页 > 试题广场 >

01背包

[编程题]01背包
  • 热度指数:27032 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
已知一个背包最多能容纳体积之和为v的物品

现有 n 个物品,第 i 个物品的体积为 vi , 重量为 wi

求当前背包最多能装多大重量的物品?

数据范围:

进阶 :
示例1

输入

10,2,[[1,3],[10,4]]

输出

4

说明

第一个物品的体积为1,重量为3,第二个物品的体积为10,重量为4。只取第二个物品可以达到最优方案,取物重量为4     
示例2

输入

10,2,[[1,3],[9,8]]

输出

11

说明

两个物品体积之和等于背包能装的体积,所以两个物品都取是最优方案  
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 计算01背包问题的结果
 * @param V int整型 背包的体积
 * @param n int整型 物品的个数
 * @param vw int整型二维数组 第一维度为n,第二维度为2的二维数组,vw[i][0],vw[i][1]分别描述i+1个物品的vi,wi
 * @return int整型
 */
function knapsack(V, n, vw) {
    // write code here
    const val = Array.from({ length: V + 1 }).map(() =>
        new Array(n + 1).fill(0)
    );

    Array.from({ length: V + 1 }).forEach((_, volumn) => {
        Array.from({ length: n + 1 }).forEach((_, count) => {
            if (!volumn || !count) return;
            const [objVolumn, objWeight] = vw[count - 1];
            if (volumn - objVolumn >= 0) {
                val[volumn][count] = Math.max(
                    val[volumn][count - 1],
                    val[volumn - objVolumn][count - 1] + objWeight
                );
            } else {
                val[volumn][count] = val[volumn][count - 1];
            }
        });
    });

    return val[V][n];
}
module.exports = {
    knapsack: knapsack,
};

发表于 2023-11-25 12:04:52 回复(0)