最常公共子序列
算法原理
代码 最常公共子序列.js
var f = longCommonSubsequence("abcde", "ace");
console.log(f);
function longCommonSubsequence(text1, text2) {
let m = text1.length;
let n = text2.length;
let f = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));
console.log(f);
for (i = 1; i <= m; i++) {
let a1 = text1[i - 1];
for (j = 1; j <= n; j++) {
let a2 = text2[j - 1];
if (a1 === a2) {
f[i][j] = f[i - 1][j - 1] + 1;
} else {
f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]);
}
}
}
return f;
}
01背包问题
算法原理
原理图
视频讲解
代码
代码目录
-
前i -1个物品的组合价值
-
仍然是前i-1个物品的组合价值,准确的说去掉当前物品容量的前i-1个物品的组合价值
-
加上当前物品的价值
var dp = backPack(
[
[2, 3],
[3, 4],
[4, 5],
[5, 6],
],
8
);
console.log(dp);
function backPack(arr, capacity) {
let [weight, value] = arr[0];
// m表示背包中物品的数量
let m = arr.length;
let dp = new Array(m + 1).fill(0).map(() => new Array(capacity + 1).fill(0));
for (i = 1; i <= m; i++) {
let [weight, value] = arr[i - 1];
for (j = 1; j <= capacity; j++) {
if (weight > j) {
dp[i][j] = dp[i - 1][j];
} else {
// 不放当前物品,就是前n个物品的最佳组合
// 放当前物品,就是背包容量减去当前物品重量,即 j - weight
// 然后再加上物品的价值,即 + value
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight] + value);
}
}
}
return dp;
}