算法打卡day36

今日任务:

1)01背包问题理论基础(卡码网:46. 携带研究材料)

2)01背包问题滚动数组(卡码网:46. 携带研究材料)

3)416. 分割等和子集

4)复习day11

卡码网:46. 携带研究材料

题目链接:46. 携带研究材料(第六期模拟笔试) (kamacoder.com)

题目描述
小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。
小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。输入描述
第一行包含两个正整数,第一个整数 M 代表研究材料的种类,第二个正整数 N,代表小明的行李空间。
第二行包含 M 个正整数,代表每种研究材料的所占空间。
第三行包含 M 个正整数,代表每种研究材料的价值。输出描述
输出一个整数,代表小明能够携带的研究材料的最大价值。输入示例
6 1
2 2 3 1 5 2
2 3 1 5 4 3
输出示例
5提示信息
小明能够携带 6 种研究材料,但是行李空间只有 1,而占用空间为 1 的研究材料价值为 5,所以最终答案输出 5。数据范围:
1 <= N <= 5000
1 <= M <= 5000
研究材料占用空间和价值都小于等于 1000

文章讲解:代码随想录 (programmercarl.com)

视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法哔哩哔哩bilibili

思路:

当解决背包问题时,我们可以使用动态规划来求解。动态规划的思想是将原问题分解成若干个子问题,先求解子问题,然后由子问题的解得到原问题的解。对于背包问题,我们可以定义一个二维数组 dp,其中 dp[i][j] 表示背包容量为 j 时,前 i 个物品能够获得的最大价值。接着,我们根据状态转移方程来填充 dp 数组:

  1. 如果当前物品的重量大于当前背包容量 j,则无法选择该物品,因此继承上一行的最大价值:dp[i][j] = dp[i-1][j]。
  2. 否则,当前物品可以选择放入或不放入背包。如果选择放入,则背包的容量减少,价值增加;如果选择不放入,则背包的容量不变,价值不增加。我们选择这两种方案中的价值较大者:dp[i][j] = max(dp[i-1][j], value[i] + dp[i-1][j - weight[i]])。

最终,我们返回 dp 数组最后一行最后一列的值,即为所求解。

def test_1_wei_bag_problem1(weight, value, bagweight):# 创建一个二维数组 dp,用于存储背包容量为 j 时,前 i 个物品能够获得的最大价值dp = [[0]*(bagweight+1) for _ in range(len(weight)+1)]# 将 weight 和 value 数组插入 0,方便后续计算weight.insert(0,0)value.insert(0,0)# 动态规划过程,填充 dp 数组for i in range(1,len(weight)):for j in range(1,bagweight+1):# 如果当前物品的重量大于当前背包容量 j,则无法选择该物品,直接继承上一行的最大价值if j < weight[i]:dp[i][j] = dp[i-1][j]else:# 否则,可以选择放入或不放入当前物品,选择其中价值较大的一种方案dp[i][j] = max(dp[i-1][j],value[i]+dp[i-1][j-weight[i]])# 返回最终结果,即 dp 数组最后一行最后一列的值return dp[-1][-1]if __name__ == "__main__":# 获取研究材料的种类 M 和小明的行李空间 N_, bagweight = map(int, input().split())# 获取每种研究材料的空间和价值weight = list(map(int, input().split()))value = list(map(int, input().split()))# 调用函数计算最大价值并输出结果result = test_1_wei_bag_problem1(weight, value, bagweight)print(result)

刚才我们是采用二维数组实现,这一题,我们还能采用一维数组实现,就是不断更新一行数组即可

文章讲解:代码随想录 (programmercarl.com)

视频讲解:带你学透01背包问题(滚动数组篇) | 从此对背包问题不再迷茫!哔哩哔哩bilibili

思路:

  1. 创建一个一维数组 dp,用于存储当前背包容量下的最大价值,初始值全部设为0。
  2. 遍历每种研究材料,对于每种材料都进行以下操作:
    • 从后向前遍历一维数组 dp,因为当前物品的选择可能会受到之前物品的影响,所以从后向前遍历能够保证只考虑当前物品的放入与不放入,不受之前物品的影响。
    • 对于每个背包容量 j,如果当前背包容量 j 大于等于当前物品的重量 weight[i],则可以选择放入当前物品。比较放入当前物品与不放入当前物品的价值大小,取较大者更新 dp[j]
  3. 返回数组 dp 中最后一个元素,即能够携带的研究材料的最大价值。
def test_2_wei_bag_problem1(weight, value, bagweight):# 创建一维数组用于存储当前背包容量下的最大价值dp = [0] * (bagweight + 1)# 遍历每种研究材料for i in range(len(weight)):# 从后向前遍历一维数组 dp,更新 dp 中的值for j in range(bagweight, weight[i] - 1, -1):# 如果当前背包容量 j 大于等于当前物品的重量 weight[i],# 则可以选择放入当前物品,比较放入当前物品与不放入当前物品的价值大小,取较大者更新 dp[j]dp[j] = max(dp[j], value[i] + dp[j - weight[i]])# 返回能够携带的研究材料的最大价值return dp[-1]if __name__ == "__main__":# 获取研究材料的种类 M 和小明的行李空间 N_, bagweight = map(int, input().split())# 获取每种研究材料的空间和价值weight = list(map(int, input().split()))value = list(map(int, input().split()))# 调用函数计算最大价值并输出结果result = test_2_wei_bag_problem1(weight, value, bagweight)print(result)

416. 分割等和子集

题目链接:416. 分割等和子集 - 力扣(LeetCode)

题目难易:中等
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200示例 1:
输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:
输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
提示:1 <= nums.length <= 200
1 <= nums[i] <= 100

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集哔哩哔哩bilibili

思路:

1.判断是否能够平分数组: 首先,计算数组的总和,如果总和为奇数,则无法平分成两个子集,直接返回 False;如果总和为偶数,则将目标值定为总和的一半。

2.动态规划数组初始化: 创建一个动态规划数组 dp,其长度为目标值加 1,初始化为0,表示每个和都无法凑成。

3.动态规划更新: 遍历数组中的每个元素,逆序遍历动态规划数组,更新动态规划数组中每个位置的值,如果当前位置的值能够凑成当前和,则更新为当前和的最大值。

4.判断最终结果: 最后判断动态规划数组中的目标值是否等于目标值本身,如果是,则说明存在一个子集的和等于目标值,返回 True,否则返回 False。

class Solution:def canPartition(self, nums: List[int]) -> bool:sum_ = sum(nums)# 如果总和为奇数,无法平分成两个子集,为偶数则将目标定为总和的一半if sum_ % 2 != 0 :return Falsetarget = sum_//2dp = [0]*(target+1)# 开始 0-1背包for num in nums:for j in range(target, num - 1, -1):  # 每一个元素一定是不可重复放入,所以从大到小遍历dp[j] = max(dp[j], dp[j - num] + num)# 集合中的元素正好可以凑成总和targetif dp[target] == target:return Truereturn False# 比较巧的方法def canPartition2(self, nums: List[int]) -> bool:sum_ = sum(nums)# 如果总和为奇数,无法平分成两个子集,为偶数则将目标定为总和的一半if sum_ % 2 != 0:return Falsetarget = sum_ // 2# 动态规划数组,dp[i] 表示是否可以用数组中的元素组成和为 idp = [False] * (target + 1)dp[0] = True  # 和为 0 总是可以组成# 遍历数组中的每个数字for num in nums:# 从后往前更新 dp 数组,防止重复利用当前数字for j in range(target, num - 1, -1):dp[j] = dp[j] or dp[j - num]  # 当前和为 i 的情况取决于之前是否能凑出 i - num 的情况return dp[target]

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RUST腐蚀服务器添加 TAGS标签教程

RUST腐蚀服务器添加 TAGS标签教程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师。我们自己搭建架设的服务器在steam展示面板看到跟别人的不一样是咋回事&#xff1f; 这个其实就是服务器的一个标签&#xff0c;那么主要的作用就是让大家在选择服务器时更快更直接的…

SpringBoot项目基于java的教学辅助平台

采用技术 SpringBoot项目基于java的教学辅助平台的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 学生信息管理 教师信息管理 课程信息管理 科目分类管…

vagrant 安装虚拟机,docker, k8s

第一步&#xff1a;安装虚拟机 1、安装 vagrant 本机是 mac, 但是这一步不影响&#xff0c;找对应操作系统的安装方式就行了。 vagrant 下载地址 brew install vagrant 2、下载 VirtualBox 虚拟机 VirtualBox 下载地址 找到对应系统下载&#xff0c;安装就可以。 尽量把…

【位运算 子集状态压缩】982按位与为零的三元组

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…

淘系电商课程,0基础实战教学,实操性系统性实时性

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89064789 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 00.前言一做好电商的基本认知 .mp4 01.电商卖货的底层逻辑和权重解析,mp4 02.做好产品的前期准备工作.mp4 03.店铺如何布局产品,m…

Java复习第二十天学习笔记(过滤器Filter),附有道云笔记链接

【有道云笔记】二十 4.8 过滤器Filter https://note.youdao.com/s/dSofip3f 一、为什么要使用过滤器 项目开发中&#xff0c;经常会用到重复代码的实现。 1、请求每个servlet都要设置编码 2、判断用户是否登录&#xff0c;只有登录了才有操作权限。 二、过滤器相关Api int…

Linux内核之WRITE_ONCE用法实例(四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Python --- 在python中安装NumPy,SciPy和Matplotlib(Windows平台)

在python中安装NumPy&#xff0c;SciPy和Matplotlib(Windows平台) NumPy NumPy是Python的一个最常用最基本的扩展程序库之一&#xff0c;主要用于矩阵运算或数组计算。很多其他的python库都要依赖于NumPy才能跑。 NumPy的发展史&#xff1a; Matrix-sig 1995年&#xff0c;特殊…

javaWeb项目-快捷酒店管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Spring Boot框架 …

绝地求生:PCL大名单公布,艾伦格三巨头惨遭拆散

就在4.16号PCL官博公布了春季赛的参赛大名单&#xff0c;此次比赛不再像以前一样分为艾伦格、米拉玛和维寒迪三组&#xff0c;而是重新打乱分成了A、B、C三组。 具体名单如下 不仅多了很多新战队&#xff0c;还有一些老家伙也回到了赛场上&#xff0c;比如四大名捕的TSG。

FMEA赋能可穿戴设备:打造安全可靠的未来科技新宠!

在科技日新月异的今天&#xff0c;可穿戴设备已成为我们生活中不可或缺的一部分。它们以其便携性、智能化和个性化的特点&#xff0c;深受消费者喜爱。然而&#xff0c;随着可穿戴设备市场的快速扩张&#xff0c;其安全性和可靠性问题也日益凸显。为了确保产品质量&#xff0c;…

Opentelemetry——Sampling

Sampling 采样 Learn about sampling, and the different sampling options available in OpenTelemetry. 了解采样以及 OpenTelemetry 中提供的不同采样选项。 With distributed tracing, you observe requests as they move from one service to another in a distributed…