首页 > 编程语言 >【前端】自学基础算法 -- 25.动态规划-01背包问题

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

时间:2025-01-15 16:00:47浏览次数:3  
标签:25 01 capacity 容量 -- 背包 values 物品 weights

动态规划-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

标签:25,01,capacity,容量,--,背包,values,物品,weights
From: https://blog.csdn.net/qq_34388186/article/details/145135925

相关文章

  • 线程每次iodelay监控及D状态开始和结束监控并做堆栈记录
    一、背景在之前的博客 获取进程或线程级别的iodelay的方法_io验证延时链-CSDN博客里,我们讲到了获取进程或线程的iodelay的方法,但是博客里讲到的获取iodelay的值是一个累积值,并不能准确的捕获到每个单次的iodelay具体是多少。这篇博客里是为了监控每个单次的iodelay,除了监控i......
  • Linux系统内存使用优化技巧
    目录交换空间(Swap)的优化禁用Swap降低swappiness值减少动态内存分配使用大页(Hugepage)优化数据访问,使用缓存和缓冲区使用堆栈缓存利用外部缓存组件使用cgroups限制进程内存使用创建cgroup限制内存使用调整OOMScore调整进程的OOM分数终止未使用的服务和......
  • C#实战|人员管理系统[29]:显示要修改的人员信息
    哈喽,你好啊,我是雷工!前面已经练习了按组织查询和按编号查询的功能,这里接着练习修改人员信息的功能;首先实现打开修改界面,以下为练习笔记。01 效果演示①当查询结果为空时,点击【修改】按钮,提示:无任何要修改的人员信息!②当有查询结果,并选中某......
  • C++搜索问题
    C++中的搜索算法是指在数据结构或图中寻找某些特定元素或满足条件的路径的算法。搜索算法广泛应用于问题求解、路径规划、数据检索等领域。常见的搜索算法可以分为两大类:无权搜索算法:如深度优先搜索(DFS)、广度优先搜索(BFS)。启发式搜索算法:如A算法、双向搜索、IDA算法等。1.......
  • 2025-1-15-十大经典排序算法 C++与python
    文章目录十大经典排序算法比较排序1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序非比较排序8.计数排序9.桶排序10.基数排序十大经典排序算法十大经典排序算法可以分为比较排序和非比较排序:前者包括冒泡排序、选择排序、插......
  • centos 7 不用yum安装mysql80
    要在CentOS7上不使用yum安装MySQL8.0,可以使用RPM包进行安装。以下是详细的步骤:下载MySQL8.0的RPM包首先,需要下载MySQL8.0的RPM包。可以从MySQL官方网站下载,或者使用wget命令直接下载。以下是一个示例:wgethttps://dev.mysql.com/get/Downloads/MySQL-......
  • 信号与系统(郑君里)第一章-绪论 1-1 课后习题解答
    题目详情(1-1分别判断题图1-1所示各波形是连续时间信号还是离散时间信号,若是离散时间信号是否为数字信号?)答案解析:(a)连续信号模拟信号(b)连续信号量化信号(c)离散信号数字信号(d)离散信号抽样信号(非数字信号)(e)离散信号数字信号(f)离散信号数字信号tips:本道题目考察了连续/......
  • 华为GaussDB数据库包括:事务性(OLTP)数据库、分析型(OLAP)数据库和混合负载(HTAP)数据库
    华为GaussDB数据库包括:事务性(OLTP)数据库、分析型(OLAP)数据库和混合负载(HTAP)数据库。这里需要解释下OLTP、OLAP、HTAP之间的区别,这也是数据库最基本的内容。据库系统一般分为两种类型:一种是面向前台应用的,应用比较简单,但是重吞吐和高并发的OLTP类型;一种是重计算的,对大数据集进行统......
  • Java反射、静态代理、动态代理
    概述反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。Spring、mybatis、动态代理、注解都是使用了反射。优点:可以让......
  • GaussDB如何创建修改数据库和数据表
    一、背景GaussDB是一款由华为开发的企业级分布式数据库,具有高性能、高可用、高可靠性等特点,广泛应用于各种业务场景。本指南将介绍如何在GaussDB中创建数据库和数据表,修改表结构,并添加约束。二、创建数据库和数据表创建数据库在GaussDB中创建数据库可以使用CREATEDATA......