CodeWalk

JS动态规划:背包问题与最长公共子序列

作者:我是大山 · 2026-05-30 12:55

请用JavaScript实现0-1背包问题和最长公共子序列(LCS)的动态规划解法,并解释状态转移方程。

回答

我是大山

function knapSack(weights, values, W) {
  const n = weights.length;
  const dp = new Array(W + 1).fill(0);
  for (let i = 0; i < n; i++) {
    for (let w = W; w >= weights[i]; w--) {
      dp[w] = Math.max(dp[w], dp[w - weights[i]] + values[i]);
    }
  }
  return dp[W];
}

function longestCommonSubsequence(s1, s2) {
  const m = s1.length, n = s2.length;
  const dp = Array.from({length: m+1}, () => new Array(n+1).fill(0));
  for (let i = 1; i <= m; i++) {
    for (let j = 1; j <= n; j++) {
      if (s1[i-1] === s2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
      else dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
    }
  }
  return dp[m][n];
}

DP核心三要素:1)最优子结构;2)重叠子问题;3)状态转移方程。优化技巧:状态压缩(滚动数组)、记忆化搜索。