day43|动态规划5-不同0-1背包的问题形态

news2024/12/23 23:26:46

关键点: 找到前后两种状态的依赖关系

  1. 经典0-1背包: 给定一个背包,问装满该背包的最大价值。
  2. 分割等和子集: 给定一个背包,能不能装满该背包(将重量抽象成价值)
  3. 最后一块石头重量: 给一个一定容量的背包,最多能装多少
  4. 目标和: 装满背包有多少种方法
  5. 一和零 :背包成为了多条件的情况

1049. 最后一块石头的重量 II

分割等和子集 的问题比较像

思考过程: 要想碰撞得到的剩下石头比较小,那么需要将石头尽可能分成相等的两堆。
转化成0-1背包: 将石头的重量抽象成价值,将一半石头的重量抽象成背包的最大容量。

  1. dp[j]:装满容量为j的物品的最大价值
  2. dp数组初始化:dp[0]=1
  3. 递推公式:dp[j] = max(dp[j],dp[j-nums[i]]+nums[i])
  4. 遍历顺序:第一层遍历物品,第二层遍历背包注意需要倒序进行遍历。
  5. 打印dp数组
class Solution:
    def lastStoneWeightII(self, stones: List[int]) -> int:
        target = sum(stones)//2
        dp = [0]*(target+1)
        dp[0] = 0
        for i in range(len(stones)):
            curValue = stones[i]
            curWeight = stones[i]
            for j in range(target,curWeight-1,-1):
                if curWeight > j:
                    break
                else:
                    dp[j] = max(dp[j],dp[j-curWeight]+curValue)
        leftPile = dp[-1]
        rightPile = sum(stones)-leftPile
        return abs(leftPile - rightPile)

494. 目标和

将原始的问题进行分割,摒弃最直接的遍历+和-,而是把它当成是分成两个组合。
给一个背包的容量,问有多少种方法装满这个容量的背包。找到left的公式,将其装化成如何装满容量大小为left的背包有多少种方案。

  1. dp[i]:表示装满容量为i的背包的方法一共有多少种方式
  2. 递推公式:dp[i] += dp[i-nums[j]]
  3. 遍历顺序
  4. 初始化:看数组中0的个数
  5. 打印dp数组
    在这里插入图片描述
class Solution:
    def findTargetSumWays(self, nums: List[int], target: int) -> int:
        Sum = sum(nums)
        left = (target + Sum)//2
        # 如果最后的结果和现有的数值相差太大,也不太行
        if abs(target) > Sum or (target + Sum) % 2 == 1:
            return 0
        dp = [0] * (left + 1)
        dp[0] = 1
        for i in range(len(nums)):
            for j in range(left,nums[i]-1,-1):
                dp[j] += dp[j-nums[i]]
        return dp[left]

474.一和零

在这里插入图片描述
思考: 可以把m个0,n个1当前一个容器,找到装满该容器最多有少个物品,最后输出这个物品即可。
每个物品只能使用一次,只不过现在每个背包有两个维度,可以理解成重量A和重量B

  1. dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]
  2. 确定递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
  3. 遍历顺序:因为在确定背包的时候有两个维度,所以需要有两层循环来遍历背包的情况。
  4. dp数组初始化:
  5. 打印dp数组
class Solution:
    def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
        dp = [[0] * (n + 1) for _ in range(m + 1)]	# 默认初始化0
        # 遍历物品,每一个物品的重量是什么样的记录每一个物品的重量,然后根据物品的重量继续寻找下边背包的条件。
        for str in strs:
            ones = str.count('1')
            zeros = str.count('0')
            # 遍历背包容量且从后向前遍历!
            for i in range(m, zeros - 1, -1):
                for j in range(n, ones - 1, -1):
                    dp[i][j] = max(dp[i][j], dp[i - zeros][j - ones] + 1)
        return dp[m][n]

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

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

相关文章

如何快速图片压缩指定大小?图片压缩到200k以内的方法

图片压缩到200k以内的介绍 在现代社交媒体和网页设计中,高质量的图片是必不可少的。但是,大型图像文件可能会导致页面加载时间过长,从而影响用户体验。这时就需要使用图片压缩技术来将图片文件大小减小到合理的范围内。其中,将图…

稳健地对时间序列光学卫星图像进行配准教程

一、引言 几何误差会导致连续卫星图像采集之间的错位,进而影响土地监测和变化检测分析。在这篇博客文章中,我们研究了如何稳健地对时间序列光学卫星图像进行配准,以减少这种错位的影响。 在本篇博客的末尾,给出用Python配准大区域…

【TES710D-EXT】基于复旦微的FMQL10S400全国产化ARM核心模块之扩展板

板卡概述 TES710D-EXT是专门针对我司TES710D(基于复旦微FMQL10S400的全国产化ARM核心板)的测试扩展板。 FMQL10S400是复旦微电子研制的全可编程融合芯片,在单芯片内集成了具有丰富特点的四核处理器(PS)和可编程逻辑&am…

B/S架构与C/S架构的区别

B/S与C/S区别: 1、c/s架构主要应用于局域网内,而b/s架构主要应用于广域网中; 2、c/s架构一般面向相对固定的用户群,对信息安全的控制能力很强,而b/s架构对安全的控制能力相对弱; 3、B/S架构维护升级比较简单…

考研算法复试刷题第20天:Dijkstra求最短路 【有向图的最短路径问题】

Dijkstra求最短路 我们先来说说这道算法的过程: 和上道题不同的是我们这次是求一个有向图到最终节点的最短距离,所以其策略也有所不同。我们先手动模拟一下过程吧假如有4个点,有他们之间有五条边,那么我们如何来求其1到4的最短路…

【Daily Share】觉得浏览器low?手写一个浏览器扩展程序,让自己的浏览器变得与众不同!!!!

浏览器扩展 概念 扩展为浏览器添加了特性与功能。它通过我们所熟悉的 Web 技术-HTML,CSS 还有 JavaScript 来创建。扩展可以利用与 JavaScript 相同的网页 API,但是扩展也可以访问它自己专有的 JavaScript API。这意味着,和在网页里编码相比…

音视频基础知识

视频基础知识 分辨率 分辨率又称为解析度,分辨率越高,像素越多,图像越清晰。 视频分辨率:又称为图像分辨率,由视频的宽高组成,表示形式宽x高,常见的视频分辨率有480P、720P、1080P、2K(2048x…

动态规划-书籍复印

动态规划-书籍复印 1 描述2 样例2.1 样例 1:2.2 样例 2: 3 解题方法3.1 算法解题思路3.2 算法代码实现 该题是lintcode上的算法题,该题的解题思路是依据九章侯老师提供的解题思路去处理的: https://www.lintcode.com/problem/437/description 1 描述 给…

ACL2023 | 黑盒大模型如何微调?清华Decoder Tuning方法提升大模型few-shot场景效果

一、概述 title:Decoder Tuning: Efficient Language Understanding as Decoding 论文地址:https://arxiv.org/abs/2212.08408 代码:GitHub - thunlp/DecT 二、Motivation 现在有很多模型只提供API,没法直接训练,…

关键字 package、import的使用

一、package 关键字的使用 为了更好的实现项目中类型的管理,提供了包的概念使用package声明类或接口所属的包,声明在源文件的首行包 术语标识符,遵循标识符的命名规则、规范(xxxyyyzzz)、“见名知意”每 “ . ”一次&…

自动化测试selenium环境搭建

自动化测试工具selenium搭建 1. 自动化和selenium基本概念 1) 什么是自动化?为什么要做自动化? 自动化测试能够代替一部分的手工测试,自动化测试能够提高测试的效率。随着项目功能的增加,版本越来越多,版本的回归测试的压力也…

DEI脉冲发生器维修DEI脉冲电源维修PVX-4130

DEI电源维修型号包括:PVX-4130,PVX-4140,PVX-4150,PVX-4120,PVX-5500等型号均可维修。 美国DEI脉冲发生器维修PULSE Generator高压电源维修 DEI脉冲发生器产生高压波形至3500V。 针对高阻抗进行了优化电容性负载,很适合驱动静电引气格栅和偏转板飞行时间质谱仪中粒…

FP独立站不同支付方式的注意事项是什么?

今天,给FP独立站的老板们介绍2个独立站支付方式,以及这些不同的支付方式分别有什么注意事项。 一、PayPal支付 大部分建站平台都支持PayPal支付通道。如果是做美国市场的独立站卖家,PayPal每笔固定收取0.3美金不同比例的手续费,不…

IOS复杂震动AHAP文件编辑指南

简介 目前部分游戏会在播放一些特定的音乐音效时,令设备产生贴合音效的复杂震动,给玩家一个更好的游戏体验。这种复杂震动就是通过苹果的CoreHaptics库实现的。 下面是关于CoreHaptics的官方文档 ​​​​​​​Core Haptics | Apple Developer Docum…

DISC行为模型

DISC行为模型 这是一种研究人行为倾向性的理论,由哈佛大学教授、临床心理学家威廉马斯顿博士提出。它可以用来预测一个人的行为倾向性,让使用者更好地了解自己和影响他人! 模型介绍 马斯顿博士发现,行事风格类似的人会展现出类似…

充电桩检测设备厂家TK4860C交流充电桩检定装置

TK4860系列是专门针对现有交流充电桩现场检测过程中接线复杂、负载笨重、现场检测效率低等问题而研制的一系列高效检测仪器,旨在更好的开展充电桩的强制检定工作。 充电桩检测设备是一款在交流充电桩充电过程中实时检测充电电量的标准仪器,仪器以新能源…

Pandora:一个让你呼吸顺畅的ChatGPT

什么是chatgpt ChatGPT是一种基于GPT(Generative Pre-trained Transformer)的聊天机器人。GPT是一种基于神经网络的自然语言处理模型,它使用大规模的文本数据进行预训练,然后可以用于各种自然语言处理任务,如文本生成…

神州数码DCN路由器之间GREIPsec 配置

拓扑: 说明: R1: g 0/0:192.168.1.1/24 g 0/1:10.1.1.1/24 tunnel 1:172.16.1.1/24 R2: g 0/0:192.168.2.1/24 g 0/1:10.1.1.2/24 tunnel 1:172.16.1.2/24 配置思路: <

阿里Github斩获4.5万Stars!分享的Spring Cloud全栈笔记,你想象不到有多全

如何获得高并发经验&#xff1f; 这是我今天逛知乎的时候系统邀请我回答的一个问题&#xff0c;由此也引发了我的一些思考&#xff1a;为什么人人都想要获得高并发经验&#xff1b;想拥有高并发系统设计技能&#xff1f; 其原因LZ认为主要有以下三点&#xff1a; 涨薪&#…

Pytorch入门(一)数据加载初始化及训练过程监控

Pytorch入门系列大致会更5篇文章不到&#xff0c;以后有机会的话再细细更新吧&#xff0c;主要复习一下Pytorch基本知识&#xff0c;复习一下在大二入门Pytorch的学习笔记&#xff01;原教程位于B站&#xff0c;讲的个人感觉蛮好的。 超级传送门&#xff0c;这个系列教程会很快…