代码随想录第35天 | ● 01背包问题,你该了解这些! ● 01背包问题—— 滚动数组 ● 416. 分割等和子集

news2024/11/19 17:26:17

01背包

题目

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

代码

function testWeightBagProblem (weight, value, size) {
    // 定义 dp 数组
    const len = weight.length,
          dp = Array(len).fill().map(() => Array(size + 1).fill(0));

    // 初始化
    for(let j = weight[0]; j <= size; j++) {
        dp[0][j] = value[0];
    }

    // weight 数组的长度len 就是物品个数
    for(let i = 1; i < len; i++) { // 遍历物品
        for(let j = 0; j <= size; j++) { // 遍历背包容量
            if(j < weight[i]) dp[i][j] = dp[i - 1][j];
            else dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
        }
    }

    console.table(dp)

    return dp[len - 1][size];
}

function test () {
    console.log(testWeightBagProblem([1, 3, 4, 5], [15, 20, 30, 55], 6));
}

test();

01背包理论基础(滚动数组)

思路

  1. 确定dp数组的定义
    在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。

  2. 一维dp数组的递推公式
    此时dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[i-1][j],即不放物品i,一个是取dp[j - weight[i]] + value[i],即放物品i,指定是取最大的,毕竟是求最大价值,

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

  1. 一维dp数组如何初始化
    dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j],那么dp[0]就应该是0,因为背包容量为0所背的物品的最大价值就是0。
    dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    那么我假设物品价值都是大于0的,所以dp数组初始化的时候,都初始为0就可以了。

  2. 一维dp数组遍历顺序
    在这里插入图片描述
    在这里插入图片描述

  3. 代码

function testWeightBagProblem(wight, value, size) {
  const len = wight.length, 
    dp = Array(size + 1).fill(0);
  for(let i = 1; i <= len; i++) {
    for(let j = size; j >= wight[i - 1]; j--) {
      dp[j] = Math.max(dp[j], value[i - 1] + dp[j - wight[i - 1]]);
    }
  }
  return dp[size];
}


function test () {
  console.log(testWeightBagProblem([1, 3, 4, 5], [15, 20, 30, 55], 6));
}

test();

416. 分割等和子集

第一想法
var canPartition = function (nums) {
    nums.sort((a, b) => a - b)
    console.log(nums);
    let l = nums[0];
    let sum = nums.reduce((x, y) => x + y)
    let r = sum - l
    let f = 1
    while (l <= r && f < nums.length) {
        if (l === r)
            return true
        l += nums[f]
        r = sum - l
        f++
    }
    f = 1
    l = nums[0] + nums[nums.length - 1]
    r = nums.reduce((x, y) => x + y) - l
    while (l <= r && f < nums.length / 2) {
        if (l === r)
            return true
        l += nums[f] + nums[nums.length - 1 - f]
        r = sum - l
        f++
    }

    return false
};

在这上面完了[1,2,3,4,5,6,7],应该还有回溯可以做

思想(带入背包)https://programmercarl.com/0416.%E5%88%86%E5%89%B2%E7%AD%89%E5%92%8C%E5%AD%90%E9%9B%86.html#%E6%80%9D%E8%B7%AF

  1. 背包的体积为sum / 2
  2. 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值
  3. 背包如果正好装满,说明找到了总和为 sum / 2 的子集。
  4. 背包中每一个元素是不可重复放入。
/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canPartition = function(nums) {
 

 let target=nums.reduce((x,y)=>x+y)/2
const dp = Array(sum / 2 + 1).fill(0);
// 开始 01背包
for(let i = 0; i < nums.length; i++) {
    for(let j = target; j >= nums[i]; j--) { // 每一个元素一定是不可重复放入,所以从大到小遍历
        dp[j] = dp[j]> dp[j - nums[i]] + nums[i]? dp[j]:dp[j - nums[i]] + nums[i]
        if(dp[j]===target)
            return true
    }
}
return false
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1062422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【已解决】spring-boot项目使用maven打包时出现BOOT-INF文件夹的问题

jar中多了这个BOOT-INF文件夹的原因&#xff0c;主要是因为我们在maven的pom文件中加入了spring-boot-maven-plugin这个插件&#xff0c;如下所示&#xff1a; 只需要将加个configuration标签&#xff0c;并在里面嵌套加入一个skip子标签&#xff0c;并将skip的值设为true&…

实现文档AI搜索,提高问题解决效率

在当今的数字时代&#xff0c;以AI为动力的文档搜索变得越来越重要。随着在线提供信息的指数增长&#xff0c;传统的搜索方法通常效率低下且耗时。实施文档AI搜索可以显著提高搜索相关文档的效率和有效性。 | 在网站中实施文档AI搜索的好处很多 首先&#xff0c;它通过提供无缝…

联想M7216NWA打印一体机墨粉清零方法

在设备就绪状态下&#xff0c; 按“功能”键&#xff0c;进入设置菜单&#xff0c;按上下键进行选择&#xff0c;屏幕出现“设备信息”项时按"确认"键&#xff0c; 再按上下键选择&#xff0c;当屏幕出现“重置硒鼓”后长按“确认”键不松手&#xff0c;指导屏幕出现…

RPC 框架之Thrift入门(一)

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

【Java 进阶篇】JDBC数据库连接池Druid详解

在Java应用程序中&#xff0c;与数据库进行交互是一个常见的任务。为了更有效地管理数据库连接并提高性能&#xff0c;数据库连接池是一种常见的解决方案。Druid是一个流行的JDBC数据库连接池&#xff0c;它具有丰富的功能和高性能。本博客将详细介绍Druid连接池&#xff0c;包…

基于ModbusTCP与西门子PLC通讯项目案例

目录 一、西门子PLC仿真环境搭建 【1.1】创建PLC项目 【1.2】编写PLC程序 二、C#代码编写 【2.1】窗口制作 【2.2】效果演示 【2.3】读取源码 【2.4】FrmSiemensSet源码 【2.5】Variable源码 一、西门子PLC仿真环境搭建 【1.1】创建PLC项目 搭建PLCSIM-Advacend模拟仿…

2023年【道路运输企业主要负责人】试题及解析及道路运输企业主要负责人复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业主要负责人试题及解析参考答案及道路运输企业主要负责人考试试题解析是安全生产模拟考试一点通题库老师及道路运输企业主要负责人操作证已考过的学员汇总&#xff0c;相对有效帮助道路运输企业主要负责人…

黑豹程序员-架构师学习路线图-百科:JavaScript-网页三剑客

文章目录 1、为什么需要JavaScript2、发展历史3、什么是JavaScript3.1、JavaScript介绍3.2、JavaScript内部结构3.3、主要功能 4、TypeScript 1、为什么需要JavaScript 前面我们已经了解了网页三剑客的HTML和CSS&#xff0c;已经明确了它们的职责。 HTML负责页面的展现&#x…

【Java】cron表达式

文章目录 1、语法2、取值3、cron表达式生成工具 定时任务相关的需求很多&#xff0c;对应的实现技术与框架也有不少&#xff0c;例如xxl-job、Quartz、Spring Task。不论怎么技术选型&#xff0c;cron表达式通常都是必要的。虽然现在生成cron表达式的小工具网站很多&#xff0c…

从某达OA到Yii2框架的cookie反序列化漏洞研究

序言 近期网上流传的某达OA存在PHP反序列化漏洞&#xff0c;导致命令执行。因为该漏洞底层是Yii2框架的漏洞&#xff0c;所以搭建好了Yii2框架环境&#xff0c;在Yii2框架的环境下来进行模拟研究&#xff0c;希望能达到举一反三和类比分析学习的目的。该cookie处反序列化漏洞属…

VBA技术资料MF66:使用代码插入行或列

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

LangChain 用例(未完)

在Azure上的OpenAI端点 注意 OpenAI key 可以用微软 用例【1. 嵌入 &#xff0c;2. 问答】 1. import os import openai from langchain.embeddings import OpenAIEmbeddings os.environ["OPENAI_API_KEY"] "****" # Azure 的密钥 os.environ["OP…

[ 车牌识别 License Plate Detection and Recognition ]

从0到1 视频讲解&#xff1a;图像处理和模式识别案例-一个简单的车牌识别系统 车牌识别 整体流程可以分成三个部分&#xff0c; (1) 车牌定位/检测&#xff1b; (2) 字符分割&#xff1b; (3) 字符识别。 它们各自发展出很多方法以应对不同的情况。 下面用一种完整的技术路线…

Java循环结构:一件事重复做才能有效果。

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、while循环1、基本语法2、注意事项3、break语句4、continue语句 二、do-while循环三、for循环1、基本语法2、注意事项 四、循…

kafka集群工作机制

一、kafka在zookeeper上的元数据解释 kafka中的broker要选举Controller角色来管理整个kafka集群中的分区和副本状态。一个Topic下多个partition要选举Leader角色和客户端进行交互数据 Zookeeper客户端工具&#xff1a; prettyZoo。 下载地址&#xff1a;https://github.com/vr…

单调队列---数据结构与算法

简介 队列也是一种受限制的线性表和栈相类似&#xff0c;栈是先进后出&#xff0c;而队列是先进先出&#xff0c;就好像一没有底的桶&#xff0c;往里面放东西&#xff0c;如图 在这里也是用数组来实现队列&#xff0c;用数组实现的叫做顺序队列 队列的数组模拟 const int N…

网络安全的发展方向是什么?网络安全学什么内容

前言 不少小伙伴开始学习网络安全技术&#xff0c;但却不知道学习网络安全能找什么工作&#xff1f;网络安全是现下较为火热的职业岗位&#xff0c;吸引了许多企业和个人对网络安全技术的青睐。学习网络安全的人越来越多&#xff0c;网络安全也有很多发展方向。那么如何选择网…

mysql日期月份相关函数

从给定日期提取最后一天&#xff1a; 要知道2017年12月的最后日期&#xff0c;可以按以下方式执行LAST_DAY()函数&#xff1a;用法:输出&#xff1a; 2017-12-31 从给定的日期时间中提取最后一天&#xff1a; 要使用日期时间格式了解月份的最后日期&#xff0c;可以按以下方式…

目标检测算法改进系列之Backbone替换为NextViT

NextViT介绍 由于复杂的注意力机制和模型设计&#xff0c;大多数现有的视觉Transformer&#xff08;ViTs&#xff09;在现实的工业部署场景中不能像卷积神经网络&#xff08;CNNs&#xff09;那样高效地执行&#xff0c;例如TensorRT 和 CoreML。这带来了一个明显的挑战&#…

Html+Css+Js计算时间差,返回相差的天/时/分/秒(从未来的一个日期时间到当前日期时间的差)。

Html部分 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><link rel"stylesheet" type"text/css" href"css/index.css" /><script src"js/index.js" t…