JavaScript 算法分析 最常公共子序列 01背包

最常公共子序列

算法原理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值