日常生活的交流与学习

首页 新随笔 联系 管理

最常公共子序列

算法原理

代码 最常公共子序列.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背包问题

算法原理

原理图

image-20211123233552620

image-20211123233625531

视频讲解


代码

代码目录

01背包问题.html

  1. 前i -1个物品的组合价值

    image-20211123234203635

  2. 仍然是前i-1个物品的组合价值,准确的说去掉当前物品容量的前i-1个物品的组合价值

    image-20211123234347845

  3. 加上当前物品的价值

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;
}

输出效果

image-20211123233825713

posted on 2021-11-23 23:46  lazycookie  阅读(63)  评论(0编辑  收藏  举报