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

代码随想录算法训练营第四十四天| 背包问题、背包问题之滚动数组、416. 分割等和子集

背包问题

题目链接:背包问题

文档讲解:代码随想录/背包问题

视频讲解:视频讲解-背包问题

状态:已完成(1遍)

解题过程 

这几天属实是有点分身乏术了,先直接看题解AC了,二刷的时候再来补上自己的思路和尝试吧。

看完代码随想录之后的想法 

用动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少;
  2. 确定递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
  3. 代码初始化如下:

    for (int j = 0 ; j < weight[0]; j++) {  // 当然这一步,如果把dp数组预先初始化为0了,这一步就可以省略,但很多同学应该没有想清楚这一点。dp[0][j] = 0;
    }
    // 正序遍历
    for (int j = weight[0]; j <= bagweight; j++) {dp[0][j] = value[0];
    }
  4. 确定遍历顺序:先遍历物品再遍历背包;
  5. 举例推导dp数组:

讲解代码如下:

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();


 背包问题之滚动数组

题目链接:背包问题之滚动数组

文档讲解:代码随想录/背包问题之滚动数组

视频讲解:视频讲解-背包问题之滚动数组

状态:已完成(1遍)

解题过程  

 看完代码随想录之后的想法 

用动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]
  2. 确定递推公式:
    dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
  3. 代码初始化如下:假设物品价值都大于0,初始化时都为0就可以了

  4. 确定遍历顺序:

    倒序遍历是为了保证物品i只被放入一次!。但如果一旦正序遍历了,那么物品0就会被重复加入多次!

    举一个例子:物品0的重量weight[0] = 1,价值value[0] = 15

    如果正序遍历

    dp[1] = dp[1 - weight[0]] + value[0] = 15

    dp[2] = dp[2 - weight[0]] + value[0] = 30

    此时dp[2]就已经是30了,意味着物品0,被放入了两次,所以不能正序遍历。

    为什么倒序遍历,就可以保证物品只放入一次呢?

    倒序就是先算dp[2]

    dp[2] = dp[2 - weight[0]] + value[0] = 15 (dp数组已经都初始化为0)

    dp[1] = dp[1 - weight[0]] + value[0] = 15

    所以从后往前循环,每次取得状态不会和之前取得状态重合,这样每种物品就只取一次了。

  5. 举例推导dp数组

讲解代码如下:

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. 分割等和子集

题目链接:416. 分割等和子集

文档讲解:代码随想录/分割等和子集

视频讲解:视频讲解-分割等和子集

状态:已完成(1遍)

解题过程  

看完代码随想录之后的想法 

用动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j];
  2. 确定递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
  3. dp数组如何初始化:本题题目中 只包含正整数的非空数组,所以非0下标的元素初始化为0就可以了;
  4. 确定遍历顺序:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历!
  5. 举例推导dp数组:

    按照这个递推公式我们来推导一下,dp数组应该是如下的数列: 10 15 30  。

讲解代码如下:

var canPartition = function(nums) {const sum = (nums.reduce((p, v) => p + v));if (sum & 1) return false;const dp = Array(sum / 2 + 1).fill(0);for(let i = 0; i < nums.length; i++) {for(let j = sum / 2; j >= nums[i]; j--) {dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);if (dp[j] === sum / 2) {return true;}}}return dp[sum / 2] === sum / 2;
};

相关文章:

代码随想录算法训练营第四十四天| 背包问题、背包问题之滚动数组、416. 分割等和子集

背包问题 题目链接&#xff1a;背包问题 文档讲解&#xff1a;代码随想录/背包问题 视频讲解&#xff1a;视频讲解-背包问题 状态&#xff1a;已完成&#xff08;1遍&#xff09; 解题过程 这几天属实是有点分身乏术了&#xff0c;先直接看题解AC了&#xff0c;二刷的时候再…...

最新一站式AI创作中文系统网站源码+系统部署+支持GPT对话、Midjourney绘画、Suno音乐、GPT-4o文档分析等大模型

一、系统简介 本文将介绍最新的一站式AI创作中文系统&#xff08;集成ChatGPTMidjourneySunoStable Diffusion&#xff09;——星河易创AI系统&#xff0c;该系统基于ChatGPT的核心技术&#xff0c;融合了自然语言问答、绘画、音乐、文档分享、图片识别等创作功能&#xff0c;…...

C# 语言类型(二)—预定义类型之字符串及字符类型简述

总目录 C# 语法总目录 参考链接&#xff1a; C#语法系列:C# 语言类型(一)—预定义类型值之数值类型 C#语法系列:C# 语言类型(二)—预定义类型之字符串及字符类型简述 C#语法系列:C# 语言类型(三)—数组/枚举类型/结构体 C#语法系列:C# 语言类型(四)—传递参数及其修饰符 C#语法…...

微信小程序canvas画图使用百分比适配不同机型屏幕达到任何屏幕比例皆可!完美适配任何机型!指定canvas尺寸适配亦可!保证全网唯一完美

错误代码示例&#xff1a; // 在onLoad中调用 const that this wx.getSystemInfo({success: function (res) {console.log(res)that.setData({model: res.model,screen_width: res.windowWidth/375,screen_height: res.windowHeight})} }) 我看到网上很多使用上面这种代码去…...

Redis-02

redis安装包位置 /opt/redis-7.2.5 redis默认安装路径&#xff1a; 配置文件路径&#xff1a;/usr/local/bin/redisconfig gcc安装位置 /opt/rhredis启动&#xff1a; 在/usr/local/bin目录下输入redis-server redisconfig/redis.confredis-cli -p 6379redis性能测试命令 red…...

如何编辑pdf文件内容?编辑技巧大揭秘,秒变办公达人!

如何编辑pdf文件内容&#xff1f;在数字化办公日益普及的今天&#xff0c;PDF文件因其跨平台、格式稳定的特点&#xff0c;成为我们日常工作和学习中不可或缺的一部分。然而&#xff0c;PDF文件的编辑却常常令人头疼&#xff0c;许多人面对需要修改内容的PDF文件时感到无从下手…...

Linux Shell Script 编写入门

Linux Shell 脚本是一种强大的工具&#xff0c;能够帮助用户自动化任务、简化系统管理以及提高工作效率。本文将带您全面了解如何编写 Linux Shell 脚本&#xff0c;并介绍一些常见的脚本编写技巧和注意事项。 目录 什么是 Linux ShellShell 脚本的基本结构常用 Shell 命令变…...

不是从APP store下载的APP在mac上一直提示有损坏,打不开怎么办?

1.点击设置 2.安全与隐私 3.通用看看允许从以下位置下载的APP是否有任何来源 4.如果没有&#xff0c;mac桌面点击&#x1f50d;输入终端或Terminal 命令行输入下述代码&#xff1a; sudo spctl --master-disable 5.回车&#xff0c;输入mac开机密码。注意&#xff1a;此时密…...

ubuntu22.04部署docker版zlmediakit和源码运行wvp-GB28181-pro

1 运行zlmediakit 1. 修改zlmediakit配置文件 先用run命令运行zlmediakit&#xff0c;将zlmediakit的配置文件拷贝出来 docker run -d -p 1935:1935 -p 8080:80 -p 8554:554 \ -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp \ --name zlmediakit \ zlmediakit/zlmedi…...

MySQL表的增删改查初阶(上篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…...

Spring Boot 集成 zxing 生成条形码与二维码

前面我们知道了怎么通过 使用 zxing 生成二维码以及条形码&#xff0c; 由于我们现在都是 web 端的项目了&#xff0c;那么我们看下怎么使用 Spring Boot 集成然后返回给前端展示&#xff1a; 工程源码 对应的工程源码我放到了这里&#xff1a;github源码路径&#xff0c;点击…...

C# 编程基础:注释、变量、常量、数据类型和自定义类型

C# 是一种功能强大的面向对象编程语言&#xff0c;它提供了丰富的特性来帮助开发者编写清晰、高效的代码。本文将介绍C#中的注释、变量、常量、基本数据类型以及如何创建和使用自定义类型。 注释 注释用于解释代码的目的&#xff0c;它们不会被程序执行。 单行注释使用 //。…...

网络原理-三

一、连接管理 建立连接,断开连接 建立连接,TCP有连接的. 客户端执行 socket new Socket(SeverIP,severPort); -> 这个操作就是在建立连接. 上述只是调用socket api,真正建立连接的过程,实在操作系统内核完成的. 内核是怎样完成上述的 " 建立连接 "过程的…...

使用Ollama搭建一个免费的聊天机器人

0 概述 Ollama是一个能在本机运行大语言模型的软件&#xff0c;它提供命令行和API的交互方式&#xff0c;对于需要考虑数据隐私的情景&#xff0c;可以方便的使用Ollama部署大语言模型&#xff0c;并在此基础上开发RAG等应用&#xff0c;而无需调用OpenAI等开放API。Ollama基本…...

计算机网络之快重传和快恢复以及TCP连接与释放的握手

快重传和快恢复 快重传可以让发送方尽早得知丢失消息&#xff0c; 当发送消息M1,M2&#xff0c;M3,M4,M5后,假如消息M2丢失&#xff0c;那么按照算法会发送对M2报文前一个报文M1的重复确认&#xff08;M1正常接受到&#xff0c;已经发送了确认),然后之后收到M4,M5,也会发送两…...

vue 引用第三方库 Swpier轮播图

本文全程干货&#xff0c;没有废话 1.使用 npm 安装 swiper&#xff0c;使用 save 保存到 packjson 中 npm install --save swiper 2、把 swiper看成是第三方库或者是组件&#xff0c;然后按照&#xff0c;引用&#xff0c;挂载组件&#xff0c;使用组件三步法。 3、在 script…...

RabbitMQ-直连交换机(direct)使用方法

RabbitMQ-默认读、写方式介绍 RabbitMQ-发布/订阅模式 目录 1、概述 2、直连交换机 3、多重绑定 4、具体代码实现 4.1 生产者部分 4.2 消费者部分 5、运行代码 6、总结 1、概述 直连交换机&#xff0c;可以实现类似路由的功能&#xff0c;消息从交换机发送到哪个队列…...

942. 增减字符串匹配 - 力扣

1. 题目 由范围 [0,n] 内所有整数组成的 n 1 个整数的排列序列可以表示为长度为 n 的字符串 s &#xff0c;其中: 如果 perm[i] < perm[i 1] &#xff0c;那么 s[i] I 如果 perm[i] > perm[i 1] &#xff0c;那么 s[i] D 给定一个字符串 s &#xff0c;重构排列 pe…...

2024华为OD机试真题-机器人搬砖-C++(C卷D卷)

题目描述 机器人搬砖,一共有N堆砖存放在N个不同的仓库中,第i堆砖中有bricks[i]块砖头, 要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格, 机器人一个小时中只能在一个仓库中搬砖,机器人的能量格每小时补充一次且能量格只在这一个小时有效,为使得机器人损…...

【DevOps】深入了解RabbitMQ:AMQP协议基础、消息队列工作原理和应用场景

目录 一、核心功能 二、优势 三、核心概念 四、工作原理 五、交换机类型 六、消息确认 七、持久性和可靠性 八、插件和扩展 九、集群和镜像队列 十、客户端库 十一、管理界面 十二、应用场景 RabbitMQ是一个基于AMQP协议的消息队列中间件&#xff0c;提供高可用、可…...

Android HTTPS抓包全解:从Charles配置到证书固定绕过

1. 为什么你手机App的HTTPS请求总像黑箱&#xff1f;——从“看不到”到“全透明”的真实起点你有没有过这种经历&#xff1a;在测试一个安卓App时&#xff0c;明明界面上显示加载失败&#xff0c;但Logcat里翻来覆去全是D/OkHttp: <-- HTTP FAILED: java.net.SocketTimeout…...

FairyGUI GLoader动效动态接管与运行时替换实战

1. 这不是简单的“换图”&#xff0c;而是动效资源的动态接管机制在 FairyGUI for Unity 项目里&#xff0c;当你看到GLoader组件上挂着一个.png或.jpg&#xff0c;心里默认它就是张静态图——但一旦你给它赋值一个MovieClip、GAnimation&#xff0c;甚至是一段从 AssetBundle …...

Java 零基础全套教程,数据结构与集合源码,笔记 168-174

Java 零基础全套教程&#xff0c;数据结构与集合源码&#xff0c;笔记 168-174 一、参考资料 【Java视频教程&#xff0c;java入门神器&#xff08;附300道Java面试题剖析&#xff09;】 https://www.bilibili.com/video/BV1PY411e7J6/?p168&share_sourcecopy_web&vd_…...

保姆级教程:用STM32F103ZET6+超声波+红外模块,从零搭建一个能报警的智能循迹小车

从零构建STM32智能循迹避障小车的全流程实战指南 在创客教育和嵌入式开发领域&#xff0c;智能小车一直是入门学习的经典项目。它不仅融合了传感器技术、电机控制和嵌入式编程等核心知识点&#xff0c;更能让学习者在完成一个完整产品的过程中获得成就感。本文将手把手带你使用…...

OpCore Simplify:一键生成OpenCore EFI的终极解决方案

OpCore Simplify&#xff1a;一键生成OpenCore EFI的终极解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果配置的复杂流程头疼吗&…...

macOS虚拟打印机:一键文档转PDF的高效解决方案

macOS虚拟打印机&#xff1a;一键文档转PDF的高效解决方案 【免费下载链接】RWTS-PDFwriter An OSX print to pdf-file printer driver 项目地址: https://gitcode.com/gh_mirrors/rw/RWTS-PDFwriter 在数字化办公环境中&#xff0c;将各类文档快速转换为PDF格式是日常工…...

QLoRA:4-bit 量化微调的完整链路

本文基于昇腾CANN和昇腾NPU&#xff0c;围绕 cann-recipes-train 仓库的相关技术展开。 QLoRA 不是简单的 LoRA 量化。它在 LoRA 的冻结权重上做了 NF4 量化&#xff0c;同时保留了 LoRA 适配器的 FP16 精度。CANN 上部署 QLoRA 模型时&#xff0c;NF4 的反量化要在 NPU 上做&…...

3步告别资源焦虑:跨平台下载神器res-downloader深度解析

3步告别资源焦虑&#xff1a;跨平台下载神器res-downloader深度解析 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否曾…...

别再复制粘贴了!手把手带你用DEFINE_PROFILE宏实现一个正弦变化入口速度

从零实现Fluent正弦速度入口&#xff1a;DEFINE_PROFILE宏实战指南 在计算流体力学(CFD)仿真中&#xff0c;标准边界条件设置往往无法满足复杂工况需求。想象这样一个场景&#xff1a;你需要模拟风力发电机叶片在阵风条件下的受力情况&#xff0c;入口风速并非恒定值&#xff0…...

Taotoken用量看板与成本管理,让团队模型开销一目了然

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken用量看板与成本管理&#xff0c;让团队模型开销一目了然 当团队开始将多个大语言模型应用于不同业务场景时&#xff0c;一…...