说明
给定一个固定大小,能够携带重量w的背包,以及一组有价值和重量的物品,找出一个最佳解决方案,是的装入背包的物品总重量不超过w,且总价值最大
例子
背包重量为5,有物品的重量为[2,3,4],价值为[3,4,5],找出最佳解决方案
思路
如下图矩阵
代码
function knapSack(capacity, weights, values) {
// 初始化矩阵,
const ks = [];
for (let i = 0; i <= values.length; i++) {
ks[i] = []
}
for (let i = 0; i <= values.length; i++) {
for (let w = 0; w <= capacity; w++) {
// 总重量为 0 或者物品为0(没有物品)的价值都为0
if(w === 0 || i ===0){
ks[i][w] = 0
}else if(weights[i-1]<=w){//只有当前物品重量小于总重量才才纳入计算
// values[i-1]为当前物品价值
// [w-weights[i - 1]] 为总重量 - 当前物品重量 = 剩余可用重量
// ks[i-1][w-weights[i - 1]] 为剩余重量的价值
let a = values[i-1] +ks[i-1][w-weights[i - 1]]
let b = ks[i-1][w]
ks[i][w] = Math.max(a,b)
}else{
// 当前物品重量大于总重量时,使用上一轮得到的价值
ks[i][w] = ks[i-1][w]
}
}
}
return ks;
}
const values = [3, 4, 5];
const weights = [2, 3, 4];
const capacity = 5;
console.log(knapSack(capacity, weights, values))