Live Note

Remain optimistic

DP-完全背包

题目:


分析:


代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
* @param {number[][]} items - [weight, value]
* @param {number} maxHeavy
*/
function resolve(items, maxHeavy) {
const len = items.length
const dp = new Array(len + 1)
.fill(null)
.map(() => new Array(maxHeavy + 1).fill(0))

for (let i = 0; i < len; i++) {
for (let j = 0; j <= maxHeavy; j++) {
if (j < items[i][0]) {
dp[i + 1][j] = dp[i][j] // 不拿这一个
} else {
dp[i + 1][j] = Math.max(
dp[i][j], // 不拿的情况

/**
* dp[i+1][j - items[i][1]] 代表上一次这个重量的 max 价值
* 加上这次拿上的价值计算 max
*/ dp[i + 1][j - items[i][0]] + items[i][1],
)
}
}
}

dp.forEach((i) => console.log(i.join(', ')))

return dp[len][maxHeavy]
}

console.log(
resolve(
[
[3, 4],
[4, 5],
[2, 3],
],
7,
),
)