当前位置: 首页 > article >正文

【前端】自学基础算法 -- 25.动态规划-01背包问题

动态规划-01背包问题

简介

动态规划(Dynamic Programming,简称 DP)是一种解决复杂问题的方法,它将问题分解为更小、更简单的子问题,并存储这些子问题的解,以避免重复计算。动态规划通常用于优化问题,如求最大值、最小值或计数问题。

动态规划的基本思想是将大问题分解为小问题,并从小问题开始解决,逐步构建到原问题的解。具体步骤如下:

  1. 定义状态:明确问题的解是什么,并定义状态变量。
  2. 建立状态转移方程:根据问题的性质,建立状态之间的递推关系。
  3. 初始化状态:确定初始状态或边界条件。
  4. 计算顺序:确定计算顺序,通常是从边界条件开始,逐步计算到最终状态。
  5. 返回结果:根据计算结果返回最终答案。

01背包问题:
给定 n 个物品和一个容量为 W 的背包,每个物品都有自己的重 w 和价值 v。
问: 如何选择物品放入背包,使得背包内物品的总价值最大,同时不超过背包的容量。

实现方法

/**
 * 01背包问题
 * 给定 n 个物品和一个容量为 W 的背包,每个物品都有自己的重 w 和价值 v。
 * 问如何选择物品放入背包,使得背包内物品的总价值最大,同时不超过背包的容量。
 * @param {*} weights
 * @param {*} values
 * @param {*} capacity
 * @returns
 */

// 定义函数 knapSack,参数包括物品重量数组 weights,物品价值数组 values,以及背包容量 capacity
function knapSack(weights, values, capacity) {
  // 获取物品数量
  var n = values.length
  // 初始化一个二维数组 T,用于存储子问题的解
  var T = []

  // 遍历每个物品
  for (let i = 0; i < n; i++) {
    // 为当前物品初始化一个行
    T[i] = []
    // 遍历每个可能的背包容量
    for (let j = 0; j <= capacity; j++) {
      // 如果背包容量为0,则最大价值为0
      if (j === 0) {
        T[i][j] = 0
        continue
      }
      // 如果当前物品重量大于背包容量,则不能选择当前物品
      if (j < weights[i]) {
        // 如果是第一个物品,则最大价值为0
        if (i === 0) {
          T[i][j] = 0
        } else {
          // 否则,最大价值为不选择当前物品时的最大价值
          T[i][j] = T[i - 1][j]
        }
        continue
      }
      // 如果是第一个物品且背包容量可以容纳该物品,则最大价值为该物品的价值
      if (i === 0) {
        T[i][j] = values[i]
      } else {
        // 否则,最大价值为选择当前物品或不选择当前物品时的最大价值
        T[i][j] = Math.max(values[i] + T[i - 1][j - weights[i]], T[i - 1][j])
      }
    }
  }

  // 返回最后一个物品在背包容量为 capacity 时的最大价值
  return T[n - 1][capacity]
}

// 定义物品重量和价值数组,以及背包容量
var weights = [2, 3, 4]
var values = [3, 4, 5]
var capacity = 5

// 调用 knapSack 函数并打印结果
console.log(knapSack(weights, values, capacity)) // 输出: 7


http://www.kler.cn/a/503961.html

相关文章:

  • 深入浅出 Android AES 加密解密:从理论到实战
  • STL之VectorMapList针对erase方法踩坑笔记
  • git使用-小白入门2
  • IOS界面传值-OC
  • 前端开发:表格、列表、表单
  • C++并发编程之跨应用程序与驱动程序的单生产者单消费者队列
  • CloudCompare视图透视问题与裁剪平面设置详解
  • RPC 源码解析~Apache Dubbo
  • 图像模糊度(清晰度)检测 EsFFT 算法详细分析
  • 测试模型安全的一些高级手段
  • Swagger学习⑲——@Webhook注解
  • 力扣6-合并两个有序链表
  • C++中引用参数与指针参数的区别与联系详解
  • Mysql 和 navicat 的使用
  • LeetCode 283题:移动零
  • 【动态规划-矩阵】4.三角形最小路径和
  • dockerfile2.0
  • 61_Redis服务器端优化
  • Android 中mk文件语法浅析
  • 鸿蒙打包发布
  • Windows CMD 常用命令
  • Docker Compose 教程
  • 【论文笔记】SmileSplat:稀疏视角+pose-free+泛化
  • 【专题】2025年节日营销趋势洞察报告汇总PDF洞察(附原数据表)
  • Idea+docker通过dockerFile方式往华为云发布项目
  • 主流消息队列(MQ)对比分析