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

打卡第34天------动态规划-01背包

我目前刷leetcode上的题的时候,不仅每天按照代码随想录的算法训练营的进度来刷题,也会自己开始在leetcode上刷题了,有些简单的题目,不用看题解就能做出来了,这也是一种进步呀。希望可以尽快找到下家工作单位,分秒必争,不浪费自己的一分一毫时间,与时间赛跑的过程呀。

一、0-1背包问题理论基础

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

1、二维数组

先遍历物品i,再遍历背包j

  • 确定dp数组含义:dp[i][j],表示从下标为[0~i]的物品里任意取,放进容量为j的背包,价值总和的最大值。
  • 确定递推公式:dp[i][j] = Math.max( dp[i-1][j], dp[i-1][j - weight[i]]+value[i] );
  • dp数组初始化
  • 打印dp数组

2、一维数组

这里跟二维数组不同的是,在遍历背包的时候是倒着遍历,从大到小,这样子倒序遍历是为了保证物品i只能被放入一次。

  • 确定dp数组含义:dp[j],表示容量为j的背包,所背的物品价值最大为dp[j];
  • 确定递推公式:dp[j] = Math.max( dp[j], dp[j - weight[i]] + value[i] )
  • dp数组初始化:
  • 打印dp数组

因为一维数组更加直观、简洁,而且空间负责度还降了一个数据量级。所以在解决01背包的问题,基本上都是采用一维数组来解决的。

二、分割等和子集

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

题目描述:

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

具体看一下思路和解题代码:

/*** @param {number[]} nums* @return {boolean}*/
// 既是重量又是价值
// dp[j] 背包容量为j。最大值为dp[j]
// 判断背包装满了,dp[target] == target, target = sum / 2;
// 二维数组压缩过来的。状态压缩,数组降维。
// 递推公式:dp[j] = Math.max(dp[j], dp[j - weight[i] + value[i]])
// 对于本题的递推公式:dp[j] = Math.max(dp[j], dp[j - nums[i] + nums[i]])
// 初始化:dp[0] = 0;
var canPartition = function(nums) {const sum = nums.reduce((pre, curr) => pre + curr, 0);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;
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【practise】数组中出现次数超过一半的数字
  • ABAP小白开发操作手册+(九)ABAP调用http
  • 泛型类型,存在确定得属性,剩下的属性都是通过泛型传进来
  • 【数据结构的——红黑树】
  • Javascript——宏任务微任务与JavaScript引擎的事件循环(Event Loop)和任务调度
  • C语言求平方和倒数
  • 【区块链+社会公益】第一反应互助急救链 | FISCO BCOS应用案例
  • leetcode50. Pow(x, n),快速幂算法
  • Java 代码详解:删除链表中的倒数第 N 个节点
  • JavaScript 数组迭代
  • WPF篇(5)- Border控件(边框布局)+GridSplitter分割窗口
  • Linux虚拟化技术的演进:Xen与KVM的历程与影响
  • 【Kubernetes】k8s集群之Pod容器资源限制和三种探针
  • 河南萌新联赛2024第(四)场:河南理工大学补题(B,C,I)
  • 软件测试面试题汇总,超详细整理。。。
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 08.Android之View事件问题
  • CEF与代理
  • Go 语言编译器的 //go: 详解
  • javascript面向对象之创建对象
  • JS 面试题总结
  • Lsb图片隐写
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • socket.io+express实现聊天室的思考(三)
  • 读懂package.json -- 依赖管理
  • 爬虫模拟登陆 SegmentFault
  • 【干货分享】dos命令大全
  • 阿里云ACE认证之理解CDN技术
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • (06)金属布线——为半导体注入生命的连接
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (31)对象的克隆
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (ZT)出版业改革:该死的死,该生的生
  • (三)SvelteKit教程:layout 文件
  • (算法)区间调度问题
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • **CI中自动类加载的用法总结
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .sh 的运行
  • @angular/cli项目构建--Dynamic.Form
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [2016.7.Test1] T1 三进制异或
  • [2669]2-2 Time类的定义
  • [Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件
  • [Angular 基础] - 指令(directives)
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [Asp.net mvc]国际化
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [C++][基础]1_变量、常量和基本类型
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [CF543A]/[CF544C]Writing Code
  • [COI2007] Sabor