diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md index d2ab191a..a40a92ab 100644 --- a/problems/背包理论基础01背包-1.md +++ b/problems/背包理论基础01背包-1.md @@ -380,53 +380,31 @@ func main() { ### javascript ```js -/** - * - * @param {Number []} weight - * @param {Number []} value - * @param {Number} size - * @returns - */ +function testWeightBagProblem (weight, value, size) { + // 定义 dp 数组 + const len = weight.length, + dp = Array(len).fill().map(() => Array(size + 1).fill(0)); -function testWeightBagProblem(weight, value, size) { -const len = weight.length, -dp = Array.from({length: len}).map( -() => Array(size + 1)) //JavaScript 数组是引用类型 -for(let i = 0; i < len; i++) { //初始化最左一列,即背包容量为0时的情况 -dp[i][0] = 0; -} -for(let j = 1; j < size+1; j++) { //初始化第0行, 只有一件物品的情况 -if(weight[0] <= j) { -dp[0][j] = value[0]; -} else { -dp[0][j] = 0; -} -} - -for(let i = 1; i < len; i++) { //dp[i][j]由其左上方元素推导得出 -for(let j = 1; j < size+1; j++) { -if(j < weight[i]) dp[i][j] = dp[i - 1][j]; -else dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - weight[i]] + value[i]); -} -} - -return dp[len-1][size] //满足条件的最大值 -} - -function testWeightBagProblem2 (wight, value, size) { - const len = wight.length, - dp = Array(size + 1).fill(0); - for(let i = 1; i <= len; i++) { - for(let j = size; j >= wight[i - 1]; j--) { - dp[j] = Math.max(dp[j], value[i - 1] + dp[j - wight[i - 1]]); + // 初始化 + for(let j = weight[0]; j <= size; j++) { + dp[0][j] = value[0]; } - } - return dp[size]; -} + // weight 数组的长度len 就是物品个数 + for(let i = 1; i < len; i++) { // 遍历物品 + for(let j = 0; j <= size; j++) { // 遍历背包容量 + if(j < weight[i]) dp[i][j] = dp[i - 1][j]; + else dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); + } + } + + console.table(dp) + + return dp[len - 1][size]; +} function test () { - console.log(testWeightBagProblem([1, 3, 4, 5], [15, 20, 30, 55], 6)); + console.log(testWeightBagProblem([1, 3, 4, 5], [15, 20, 30, 55], 6)); } test();