现有 n 个物品,第 i 个物品的体积为 vi , 重量为 wi
求当前背包最多能装多大重量的物品?
数据范围: , , ,
进阶 :
10,2,[[1,3],[10,4]]
4
第一个物品的体积为1,重量为3,第二个物品的体积为10,重量为4。只取第二个物品可以达到最优方案,取物重量为4
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, };