Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit dea70e1

Browse files
committed
feat: 01背包-dp版
1 parent bddd86e commit dea70e1

File tree

4 files changed

+67
-24
lines changed

4 files changed

+67
-24
lines changed

.prettierrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"printWidth": 140,
2+
"printWidth": 80,
33
"tabWidth": 2
44
}

动态规划/01背包-DP版.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
*
3+
* @param {number[]} w 物品的重量集合
4+
* @param {number[]} v 物品的价值集合
5+
* @param {number} C 背包容量
6+
*/
7+
let knapsack01 = function (w, v, C) {
8+
let n = w.length;
9+
if (n === 0) return 0;
10+
11+
// 构建二维数组dp表
12+
// x轴代表背包容量 y轴代表考虑的硬币情况
13+
// 第一行只考虑一种硬币(基准情况)
14+
// 第二行考虑一和二两种(通过拿取二和不拿二,再去组合第一行的最佳情况来求最大值)
15+
// 第三行以此类推
16+
let memo = new Array(n);
17+
for (let i = 0; i < memo.length; i++) {
18+
memo[i] = new Array(C + 1).fill(0);
19+
}
20+
21+
// 基础情况 背包在各个容量的情况下 只考虑第一个物品时的最优解
22+
for (let j = 0; j <= C; j++) {
23+
memo[0][j] = j >= w[0] ? v[0] : 0;
24+
}
25+
26+
for (let i = 1; i < n; i++) {
27+
for (let j = 0; j <= C; j++) {
28+
let weight = w[i];
29+
let restWeight = j - weight;
30+
// 有足够容量的情况下 选择当前的的物品 并且用剩余的重量去找前面几个物品组合的最优解
31+
let pickNow = j >= weight ? v[i] + memo[i - 1][restWeight] : 0;
32+
33+
// 另一种选择 这个物品不放进背包了 直接求用这个背包容量组合前面几种物品的最优解
34+
let pickPrev = memo[i - 1][j];
35+
36+
memo[i][j] = Math.max(pickNow, pickPrev);
37+
}
38+
}
39+
40+
return memo[n - 1][C];
41+
};
42+
43+
console.log(knapsack01([1, 2, 3], [6, 10, 12], 5));

动态规划/01背包-递归版.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ function bestValue(w, v, index, c) {
3030
return max;
3131
}
3232

33-
console.log(knapsack01([1, 2, 3], [4, 5, 15], 3));
33+
console.log(knapsack01([1, 2, 3], [6, 10, 12], 5));
Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
function f(n) {
22
function makeChange(amount) {
3-
if(amount <= 0) return 0
4-
5-
// 校验是否已经在备忘录中存在结果,如果存在返回即可
6-
if(cache[amount]) return cache[amount]
7-
8-
let min = Infinity
9-
if (amount >= 1) {
10-
min = Math.min(makeChange(amount-1) + 1, min)
11-
}
12-
13-
if (amount >= 5) {
14-
min = Math.min(makeChange(amount-5) + 1, min)
15-
}
16-
17-
if (amount >= 11) {
18-
min = Math.min(makeChange(amount-11) + 1, min)
19-
}
20-
21-
return (cache[amount] = min)
3+
if (amount <= 0) return 0;
4+
5+
// 校验是否已经在备忘录中存在结果,如果存在返回即可
6+
if (cache[amount]) return cache[amount];
7+
8+
let min = Infinity;
9+
if (amount >= 1) {
10+
min = Math.min(makeChange(amount - 1) + 1, min);
11+
}
12+
13+
if (amount >= 5) {
14+
min = Math.min(makeChange(amount - 5) + 1, min);
15+
}
16+
17+
if (amount >= 11) {
18+
min = Math.min(makeChange(amount - 11) + 1, min);
19+
}
20+
21+
return (cache[amount] = min);
2222
}
2323
// 备忘录
24-
const cache = []
25-
return makeChange(n)
24+
const cache = [];
25+
return makeChange(n);
2626
}
2727

28-
console.log(f(5000))
28+
console.log(f(5000));

0 commit comments

Comments
 (0)