You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解背包问题的代码属于动态规划还是分治法?盼技术解析

分析你的背包问题实现与动态规划核心特性

1. 你的代码是分治法,而非动态规划

先来看你提供的实现代码:

const ACTIVITIES = [ 
  {name: 'side-project', time: 10, xp: 12}, 
  {name: 'algorithms', time: 3, xp: 7}, 
  {name: 'networking', time: 1, xp: 0.5}, 
  {name: 'exercise', time: 2, xp: 1.5}, 
  {name: 'systems design', time: 4, xp: 4}, 
  {name: 'making CSS codepens', time: 3, xp: 4} 
]; 

const findJob = function(time, activities) { 
  const optimalSolution = function(items, n = items.length, timeLeft = time) { 
    if (n === 0 || timeLeft === 0) { 
      return []; 
    } 
    if (items[n - 1].time > timeLeft) { 
      return optimalSolution(items, n - 1, timeLeft); 
    } 
    const lastItem = items[n - 1]; 
    const withLastItem = [ 
      lastItem, ...optimalSolution(items, n - 1, timeLeft - lastItem.time) 
    ]; 
    const withoutLastItem = optimalSolution(items, n - 1, timeLeft); 
    if (totalXp(withLastItem) > totalXp(withoutLastItem)) { 
      return withLastItem; 
    } else { 
      return withoutLastItem; 
    } 
  }; 

  const totalXp = arr => arr.reduce((total, ea) => total + ea.xp, 0); 

  const sortedByTime = activities 
    .slice() 
    .sort((a, b) => a.time - b.time); 

  return optimalSolution(sortedByTime) 
    .map(act => act.name); 
};

这段代码的逻辑是递归遍历每个物品,每次做「选当前物品」或「不选当前物品」的决策,最终返回总XP更高的组合。但它完全没有记忆化(memoization)或制表(tabling)的逻辑——当不同的递归路径遇到相同的n(剩余物品数)和timeLeft(剩余时间)时,它会重复计算完全一致的子问题,而不是复用之前的计算结果。

这正是朴素递归分治法的典型特征:它将大问题拆分为子问题解决,但没有利用子问题的重叠性做性能优化。而动态规划的核心价值就是通过记忆化或制表避免这种重复计算,所以你的这段实现确实不是动态规划,只是带决策逻辑的分治法。

2. 动态规划必须采用记忆化或制表方案吗?

答案是肯定的——动态规划的定义依赖两个核心特性:

  • 最优子结构:大问题的最优解可以由子问题的最优解组合而成;
  • 重叠子问题:不同的大问题会重复调用相同的子问题。

记忆化(自顶向下,用缓存存储已计算的子问题结果)和制表(自底向上,用表格逐步填充子问题结果),正是解决重叠子问题的两种标准实现方式。如果没有这两种优化,你只是在做普通的递归分治,并没有利用动态规划的核心优势,也就不能称之为动态规划。

举个简单的改造思路:你可以给optimalSolution添加一个缓存(比如二维数组或Map),存储已经计算过的n和timeLeft对应的最优结果,再次遇到相同子问题时直接返回缓存值,这样就把它改成了动态规划的自顶向下实现。

内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:13:29