0-1背包问题
给定背包容量 找重量不大于给定背包容量的最大 value
0-7 为递增的固定大小的背包容量
定义一个二维数组 dp
value为每个weight的价值
设置 i 循环遍历
weight设置为重量
设置 j 循环遍历
设置比较条件
j === 0 (第一列 即是说背包重量为0)
dp[i][j] = 0
dp[i][0] = 0
j <= weight[i] (逐行比较)
if ( i === 0 )
dp[i][j] = 0
dp[0][0] = 0
else
直接复制上一行数据 因为背包重量 < 给定的weight
dp[i][j] = dp[i-1][j]
if ( i === 0 )
设置第一行数据
dp[i][j] = value[i]
dp[0][j] = value[0]
else
dp[i][j] = Math.ma(dp[i - 1][j], dp[i][j - weight[i]] + value[i])
代码
// 01背包
// 设置背包容量
var total = 7;
// 定义重量数组
var weight = [1, 3, 4, 5];
// 定义价值数组
var value = [1, 4, 5, 7];
var n = value.length;
function Bag(weight, value, total, n) {
// 定义二维数组
var dp = [];
for (let i = 0; i < n; i++) {
dp[i] = [];
for (let j = 0; j <= total; j++) {
// 容量为0的情况
if (j === 0) {
dp[i][j] = 0;
continue;
}
// 逐行比较
// 容量小于物品重量
if (j < weight[i]) {
if (i === 0) {
dp[i][j] = 0;
} else {
// 直接复制上一行数据
dp[i][j] = dp[i - 1][j];
}
continue;
}
if (i === 0) {
// 设置第一行
dp[i][j] = value[i];
// dp[0][j] = value[0];
}
else {
// 最大值比较 取最大值
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]);
}
}
}
return dp;
}
console.log(Bag(weight, value, total, n));