算法打卡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 False

        target = sum_//2

        dp = [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)

        # 集合中的元素正好可以凑成总和target
        if dp[target] == target:
            return True
        return False

    # 比较巧的方法
    def canPartition2(self, nums: List[int]) -> bool:
        sum_ = sum(nums)
        # 如果总和为奇数,无法平分成两个子集,为偶数则将目标定为总和的一半
        if sum_ % 2 != 0:
            return False

        target = sum_ // 2

        # 动态规划数组,dp[i] 表示是否可以用数组中的元素组成和为 i
        dp = [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.mfbz.cn/a/550576.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

35、链表-LRU缓存

思路&#xff1a; 首先要了解LRU缓存的原理&#xff0c;首先定下容量&#xff0c;每次get请求和put请求都会把当前元素放最前/后面&#xff0c;如果超过容量那么头部/尾部元素就被移除&#xff0c;所以最近最少使用的元素会被优先移除&#xff0c;保证热点数据持续存在。 不管放…

排序(三)——快速排序(递归以及栈和队列实现非递归)超详细

目录 1.hoare法 2.挖坑法 3.前后指针法 4.快排的非递归 4.1 栈实现快排非递归 4.2 队列实现快排非递归 快排我们之前在学习通讯录的时候就用了&#xff0c;那时候我们知道快排是一个很牛逼的排序算法&#xff0c;那他到底是怎么实现的呢&#xff1f; 1.hoare法 快速排序…

【Redis 神秘大陆】003 数据类型使用场景

三、Redis 数据类型和使用场景 Hash&#xff1a;对象类型的数据&#xff0c;购物车List&#xff1a;队列/栈Set&#xff1a;String类型的无序集合&#xff0c;intset&#xff0c;抽奖、签到、打卡&#xff0c;商品评价标签Sorted Set&#xff1a;存储有序的元素&#xff0c;zip…

六、OpenFeign服务接口调用

一、提问 已经有loadbalancer为什么还要学习OpenFeign? 两个都有道理的话&#xff0c;日常用那个&#xff1f; 二、是什么 OpenFeign是什么 官网翻译 Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用Feign创建一个接口并对其进行注释。它具有可…

【InternLM 实战营第二期笔记】LMDeploy 量化部署 LLMVLM实战

Huggingface与TurboMind介绍 Huggingface HuggingFace是一个高速发展的社区&#xff0c;包括Meta、Google、Microsoft、Amazon在内的超过5000家组织机构在为HuggingFace开源社区贡献代码、数据集和模型。可以认为是一个针对深度学习模型和数据集的在线托管社区&#xff0c;如…

python 列表对象函数

对象函数必须通过一个对象调用。 列表名.函数名() append() 将某一个元素对象添加在列表的表尾 如果添加的是其他的序列&#xff0c;该序列也会被看成是一个数据对象 count() 统计列表当中 某一个元素出现的次数 extend() 在当前列表中 将传入的其他序列的元素添加在表尾…

【AIGC】AIGC在虚拟数字人中的应用:塑造未来互动体验的革新力量

&#x1f680; &#x1f680; &#x1f680;随着科技的快速发展&#xff0c;AIGC已经成为引领未来的重要力量。其中&#xff0c;AIGC在虚拟数字人领域的应用更是引起了广泛关注。虚拟数字人作为一种先进的数字化表达形式&#xff0c;结合了3D建模、动画技术、人工智能等多种先进…

Kubernetes对象的定义和操作

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

数据密集型应用系统设计 PDF 电子书(Martin Kleppmann 著)

简介 《数据密集型应用系统设计》全书分为三大部分&#xff1a; 第一部分&#xff0c;主要讨论有关增强数据密集型应用系统所需的若干基本原则。首先开篇第 1 章即瞄准目标&#xff1a;可靠性、可扩展性与可维护性&#xff0c;如何认识这些问题以及如何达成目标。第 2 章我们比…

PHP反序列化命令执行+PHP反序列化POP大链 +PHP反序列化基础

[题目信息]&#xff1a; 题目名称题目难度PHP反序列化命令执行1 [题目考点]&#xff1a; 反序列化命令执行&#xff0c;获取题目flag。[Flag格式]: SangFor{t5euvZ_OB8Jd_h2-}[环境部署]&#xff1a; docker-compose.yml文件或者docker tar原始文件。 docker-compose up …

内外网文件摆渡系统,如何贯通网络两侧被隔断的工作流?

随着业务范围不断扩大&#xff0c;产生的数据体量越来越多&#xff0c;企业会采取网络隔离&#xff0c;对核心数据进行保护。网络隔离主要目的是保护企业内部的敏感数据和系统不受外部网络攻击的风险&#xff0c;可以通过物理或逻辑方式实现&#xff0c;例如使用防火墙、网闸、…

电商技术揭秘二十六:智能库存预警与补货系统(下)

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

我的思考工作流(2024年版)

去年底&#xff0c;我对自己的思考工作流程又做了一些优化和改进&#xff0c;把它变得更为简洁、清晰。 因此&#xff0c;今天我想把它分享给大家&#xff0c;希望能给你一些启发。 我的核心方法论依然是我自己提出的「INKP知识管理法」&#xff08;参见《打开心智》第五章&…

【刷题笔记】第七天

文章目录 [924. 尽量减少恶意软件的传播](https://leetcode.cn/problems/minimize-malware-spread/)方法一&#xff0c;并查集方法二&#xff0c;dfs [GCD and LCM ](https://vjudge.net.cn/problem/HDU-4497#authorKING_LRL) 924. 尽量减少恶意软件的传播 如果移除一个感染节…

电机控制器电路板布局布线参考指导(五)

电机控制器电路板布局布线参考指导&#xff08;五&#xff09;大容量电容和旁路电容的放置 1.大容量电容的放置2.电荷泵电容器3.旁路电容/去耦电容的放置3.1 靠近电源3.2 靠近功率器件3.3 靠近开关电流源3.4 靠近电流感测放大器3.5 靠近稳压器 tips&#xff1a;资料主要来自网络…

环境搭建创建项目_使用DevEco开发工具进行开发_创建项目_认识项目结构---HarmonyOS4.0+鸿蒙NEXT工作笔记001

首先去下载DevEco Studio然后再去安装就可以了 安装下一步下一步非常简单 首先去安装nodejs,可以看到,有两个安装方法,左边是自己安装的制定文件夹就可以了,然后 右边是使用鸿蒙自带的,我们选择第二个 然后我们看这个ohpm其实就跟npm是一个意思,用来管理鸿蒙的包的. 这里我们…

apache配置ssl证书

SSL证书&#xff0c;即安全套接层证书&#xff0c;是一种数字证书&#xff0c;它通过在客户端浏览器和Web服务器之间建立一条加密通道&#xff0c;保证了双方传输信息的安全性。当用户访问一个使用SSL证书保护的网站时&#xff0c;浏览器会显示一个锁形图标&#xff0c;表示连接…

FILE类与IO流

目录 File类的实例化与常用方法 File类的理解 文件路径的表示方式&#xff1a; API的使用 IO流概述与流的分类 I/O流中的是Input/Output的缩写 IO流的分类&#xff08;不同角度&#xff09; Java程序中的IO流涉及40多个&#xff0c;但实际上都是由4个抽象类衍生出来的。 F…

零代码编程:用kimichat将mp4视频批量转为mp3音频

一个文件夹里面有多个子文件夹&#xff0c;里面的视频需要转成为mp3音频格式。可以在kimichat中键入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个Python脚本的编写任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;D:\CHATGPT For TikT…

Docker Container (容器) 常见命令

Docker 容器的生命周期 什么是容器&#xff1f; 通俗地讲&#xff0c;容器是镜像的运行实体。镜像是静态的只读文件&#xff0c;而容器带有运行时需要的可写文件层&#xff0c;并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容 器有初建、运行、停止、暂停和删除…
最新文章