代码随想录算法训练营第三十八天 | 322.零钱兑换 279.完全平方数 139.单词拆分 多重背包以及背包总结

LeetCode 322.零钱兑换:

文章链接
题目链接:322.零钱兑换

思路:

首先分析题目,每种硬币的数量是无限的,因此为完全背包问题;又要求返回的是最少硬币个数,因此与组合数/排列数无关,先背包后物品还是先物品后背包均可,此处采用先物品后背包的方式

  • ① dp数组及下标的含义
    dp[j] : 凑成背包金额为 j 所需的最少硬币个数为dp[j]
  • ② 递推式
    那么依据是否选择coins[i]来分类
    如果选择coins[i] , 那么硬币个数为dp[j - coins[i]] + 1
    如果不选coins[i],那么硬币个数为dp[j]
    求最少硬币个数,因此是两个求min
    dp[j] = min(dp[j], dp[j - coins[i]] + 1)
  • ③ 初始化
    由例子可知,dp[0]=0,可以凑成总金额为0的硬币个数为0,其余非0初始化为"inf",避免初始化对递推式产生影响。
  • ④ 遍历顺序
    由前面题目分析可知,遍历顺序为先物品后背包,且均为顺序遍历
  • ⑤ 举例
    在这里插入图片描述
class Solution:def coinChange(self, coins: List[int], amount: int) -> int:# 初始化dp = [float('inf')] * (amount + 1)dp[0] = 0# 递推for coin in coins:for j in range(coin, amount + 1):dp[j] = min(dp[j], dp[j - coin] + 1)# 返回结果if dp[amount] == float('inf'):return -1return dp[amount]

LeetCode 279.完全平方数:

文章链接
题目链接:279.完全平方数

思路:

首先分析题目:给定一个整数n,求和为n的最少完全平方数的数目,且加和为n的完全平方数可重复,因此为完全背包问题,且要求的是最少,因此可以认为是上一题的改编。
区别在于,本题没有直接给出coins数组,但是分析可知,物品的重量/价值为 [1, int(sqrt(n))]中每个数的平方

  • ① dp数组及下标的含义
    dp[j] : 凑成背包重量/价值为 j 所需的最少完全平方数个数为dp[j]
  • ② 递推式
    将上一题中是否选择coins[i]修改为了 i^2,其余相同
    dp[j] = min(dp[j], dp[j - i ^ 2] + 1)
  • ③ 初始化
    dp[0] = 0,其余非0初始化为最大值 inf
  • ④ 遍历顺序
    由前面题目分析可知,遍历顺序为先物品后背包,且均为顺序遍历(先背包后物品也可以)
  • ⑤ 举例
    在这里插入图片描述
"""
先物品后背包
"""
class Solution:def numSquares(self, n: int) -> int:maxi = int(sqrt(n)) # 物品重量的取值范围if n == maxi * maxi:return 1dp = [float('inf')] * (n + 1)dp[0] = 0for i in range(1, maxi + 1):powi = i * ifor j in range(powi, n + 1):dp[j] = min(dp[j], dp[j - powi] + 1)return dp[n]"""
先背包后物品
"""
class Solution:def numSquares(self, n: int) -> int:maxi = int(sqrt(n)) # 物品重量的取值范围if n == maxi * maxi:return 1dp = [float('inf')] * (n + 1)dp[0] = 0for j in range(1, n + 1):i = 1while i * i <= j:dp[j] = min(dp[j], dp[j - i * i] + 1)i += 1return dp[n]

LeetCode 139.单词拆分:

文章链接
题目链接:139.单词拆分

思路

首先分析题目:s是否可以由字典中的单词拼接得到,且字典中的单词可以重复使用,因此是完全背包问题,并且拼接得到,因为拼接有先后顺序,因此本题为排列,遍历顺序应当为先背包后物品

  • ① dp数组及下标含义
    dp[j]表示s[0:j]能否由字典中的单词拼接得到,为了便于初始化,因此s[j]是取不到的,从而dp[0]可以初始化为True
  • ② 递推式
    按照wordDict[i]是否取来分类
    如果取wordDict[i],那么应当判断s[j - wordDict[i] : j] == wordDict[i] 与 dp[j - wordDict[i]](dp[j] 判断的是s[0:j],取不到s[j])(本质上是判断截取到的单词是否与词典中的相同,且截取后的部分是否可以被词典中的单词所拼接得到)
    如果不取wordDict[i],那么dp[j] = dp[j]
    因为只需要判断s是否可以由字典中的单词构成,因此对于分出的类的结果是取 or
    dp[j] = dp[j] or (s[j - len(wordDict[i])] == wordDict[i] and dp[j - len(wordDict[i])])
  • ③ 初始化
    dp[0] = True,其余非0初始化为False,避免初始化对递推结果产生影响
  • ④ 遍历方式
    由前面题目分析可知,本题应当是求排列,遍历方式为先背包后物品,且均为顺序遍历
  • ⑤ 举例
    在这里插入图片描述
    有一些需要注意的地方:
    1)首先因为遍历顺序为先背包后物品,所以可能出现len(s[0:j]) 即 j < len(wordDict[i])的情况,并且这种情况也不方便直接在第二层遍历中去除(即改range),因此在第二层循环体内加条件判断去除;
    2)其次,由递推公式可知,需要判断s[j - len(wordDict[i])] == wordDict[i],实际上在递推公式前可以加剪枝,直接判断s[j - 1] == wordDict[i][-1],如果不相等,那么后面不需要递推公式判断,直接就是False;否则才使用递推公式得到dp[j]
"""
第二层遍历是遍历的词典中的词
"""
class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:lens = len(s)# dp[j]表示s[0:j]能否由字典中的单词拼接得到,其中s[j]取不到dp = [False] * (lens + 1)dp[0] = True# 递推,分析题目得到是求排列,先背包后物品for j in range(1, lens + 1):for word in wordDict:# 先进行判断s[0:j]的长度和剪枝if len(word) > j or word[-1] != s[j - 1]:continuedp[j] = dp[j] or (dp[j - len(word)] and s[j - len(word):j] == word)return dp[lens]不太确定:
时间复杂度为O(m * n * L)
其中m = len(wordDict), n = len(s), L为词典中单词的最大长度。
空间复杂度为O(n)"""
第二层遍历是对s[j]的后半部分进行剪切
1. 递推式还可以这么理解 dp[j] = dp[j] or (s[i:j] in wordSet and dp[i])
2. 对dp[j]的后半部分进行切分,i 为切分的开始位置,i 的范围为[0, j - 1](双闭),
3. 判断s[i:j]是否在词典中出现过,且dp[i]是否能由词典中的词拼接得到
"""
class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:lens = len(s)wordSet = set(wordDict)# dp[j]表示s[0:j]能否由字典中的单词拼接得到,其中s[j]取不到dp = [False] * (lens + 1)dp[0] = True# 递推,分析题目得到是求排列,先背包后物品for j in range(1, lens + 1):for i in range(j):if dp[i] and s[i:j] in wordSet:dp[j] = Truereturn dp[lens]不太确定
时间复杂度为O(n^2)
空间复杂度为O(n)    

实现过程中遇到的问题:

两个代码时间复杂度的分析


多重背包:

有N种物品和一个容量为V的背包。第 i 种物品最多有Mi件可用,每件耗费的空间为Ci,价值为Wi。求解将哪些物品装入背包可使得这些物品耗费的的空间总和不超过背包容量,且价值总和最大。
多重背包与01背包相似。只要将多重背包中,每个物品最多有Mi件可用,将Mi件分隔开,就变成了一个01背包问题。
题目链接:卡码网 56

class Solution():def multiBag(self, bagWeight, N, weight, value, nums):dp = [0] * (bagWeight + 1)# 遍历for i in range(N):  # 先遍历物品#print("i: " + str(i))for j in range(bagWeight, weight[i] - 1, -1):   # 再逆序遍历背包for k in range(1, nums[i] + 1): # 需要加一个遍历物品数量的# 如果大于背包容量直接跳出循环if j < k * weight[i]:breakdp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i])#print("j: " + str(j) + " dp[j]: " + str(dp[j]))#print()return dp[-1]bagWeight, N = [int(x) for x in input().split()]
weight = [int(x) for x in input().split()]
value = [int(x) for x in input().split()]
nums = [int(x) for x in input().split()]
solution = Solution()
print(solution.multiBag(bagWeight, N, weight, value, nums))

实现过程中遇到的问题:

首先要想到,多重背包中添加第三层循环k,其次注意range为左闭右开,因此是range(1, nums[i] + 1),最后出现错误就打印dp数组


背包总结:

文章链接

学习收获:

完全背包的应用,明确递推公式和遍历顺序,借用多重背包复习了01背包问题,以及完全背包的组合数/排列数的内外层遍历先后顺序,最后的单词拆分第二层循环既可以是词典,也可以是对s[j]的后半部分的划分

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

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

相关文章

计算机网络WebSocket——针对实习面试

目录 计算机网络WebSocket什么是WebSocket&#xff1f;WebScoket和HTTP协议的区别是什么?说明WebSocket的优势和使用场景&#xff1f;说明WebSocket的建立连接的过程&#xff1f; 计算机网络WebSocket 什么是WebSocket&#xff1f; WebSocket是一个网络通信协议&#xff0c;提…

在Ubuntu 24.04 LTS上安装飞桨PaddleX

前面我们介绍了《在Windows用远程桌面访问Ubuntu 24.04.1 LTS》本文接着介绍安装飞桨PaddleX。 PaddleX 3.0 是基于飞桨框架构建的一站式全流程开发工具&#xff0c;它集成了众多开箱即用的预训练模型&#xff0c;可以实现模型从训练到推理的全流程开发&#xff0c;支持国内外多…

LM2 : A Simple Society of Language Models Solves Complex Reasoning

文章目录 题目摘要简介相关工作方法论实验结果结论局限性 题目 LM2&#xff1a;简单的语言模型社会解决复杂推理问题 论文地址&#xff1a;https://aclanthology.org/2024.emnlp-main.920/ 项目地址&#xff1a; https://github.com/LCS2-IIITD/Language_Model_Multiplex 摘要…

(三十三)队列(queue)

文章目录 1. 队列&#xff08;queue&#xff09;1.1 定义1.2 函数1.3 习题1.3.1 例题&#xff08;周末舞会&#xff09; 2. 双向队列&#xff08;deque&#xff09;2.1 定义2.2 函数2.3 题目2.3.1 例题&#xff08;打BOSS&#xff09; 1. 队列&#xff08;queue&#xff09; 队…

web——upload-labs——第二关

MIME验证 MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09;验证是指在互联网传输中&#xff0c;通过检查数据的MIME类型来确保数据格式的正确性和安全性。MIME最初是为了扩展电子邮件的功能&#xff0c;让邮件支持多种格式&#xff0c;如文本、图片、音频等…

Vue3 -- 集成sass【项目集成5】

集成sass&#xff1a; 看过博主的 配置styleLint工具应该已经安装过 sass sass-loader 了&#xff0c;所以我们只需要加上我们的 lang"scss"即可。 <style scoped lang"scss"></style>给项目添加全局样式文件&#xff1a; 在src文件夹下创建…

【Web前端】Promise的使用

Promise是异步编程的核心概念之一。代表一个可能尚未完成的操作&#xff0c;并提供了一种机制来处理该操作最终的成功或失败。具体来说&#xff0c;Promise是由异步函数返回的对象&#xff0c;能够指示该操作当前所处的状态。 当Promise被创建时&#xff0c;它会处于“待定”&a…

EI检索!2024年大数据与数据挖掘会议(BDDM 2024)全解析!

第二届大数据与数据挖掘国际会议&#xff08;BDDM 2024&#xff09;将于2024年12月13-15日在武汉举行&#xff0c;已启动第二轮征稿&#xff0c;截稿2024年11月30日。邀请学者探讨大数据与数据挖掘进展&#xff0c;可在线投稿及AC学术中心查看详情。 大会官网&#xff1a;www.i…

基于java+ssm+Vue的校园美食交流系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

关于 MSVCP110.dll 缺失的解决方案

背景&#xff1a;之前使用 PR&#xff08;Adobe Premiere&#xff09; 从来没有遇到过这样的问题。今天重装系统后&#xff08;window 10&#xff09;&#xff0c;想要重新安装以前的软件时&#xff0c;遇到了以下 DLL 文件缺失的错误。 解决方案&#xff1a; 可以到微软官网的…

Python小游戏27——飞翔的小鸟

首先&#xff0c;你需要确保已经安装了Pygame库。如果还没有安装&#xff0c;可以通过以下命令进行安装&#xff1a; 【bash】 pip install pygame 游戏的代码&#xff1a; 【python】 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕大小和标题 screen_…

【Three.js基础学习】24. shader patterns

前言 课程回顾: ShaderMaterial 这里用的是着色器材质 所以顶点和片段着色器就不需要像原始着色器那样添加需要的属性 然后写 片段着色器需要属性 &#xff1a; 顶点 属性 -》变化 -》 片段中 顶点中的属性不需要声明 只需要声明传送的变量 例如 varying vec vUv; vUv uv; 补充…

构建客服知识库:企业效率提升的关键步骤

客服知识库是企业提升客户服务效率和质量的重要工具。它不仅帮助客服团队快速准确地回答客户问题&#xff0c;还能通过数据分析来优化服务流程和提升客户满意度。 1. 明确知识库的目标和范围 构建客服知识库的第一步是明确其目标和范围。这包括确定知识库的主要用户群体、需要…

运动汇 专业的比赛管理平台数据获取

在获取到运动汇的网站链接后&#xff0c;界面如图所示: 右键检查&#xff0c;我们会发现没有任何数据&#xff0c;只有当我们点开这些"第一单元"、"第二单元"等&#xff0c;数据才会加载出来&#xff1b; 由于我们只需要分析这一个网页并获取其中的数据&a…

免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制

Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点&#xff0c;博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体&#xff0c;Blog站点所形成的网状结构促成了不同于以往社区的Blog文化&#xff0c;Blog技术缔造了“博客”文化。本文课题研究的“…

Docker环境搭建Cloudreve网盘服务(附shell脚本一键搭建)

Docker搭建Cloudreve Cloudreve介绍&#xff1a; Cloudreve 是一个基于 ThinkPHP 框架构建的开源网盘系统&#xff0c;旨在帮助用户以较低的成本快速搭建起既能满足个人也能满足企业需求的网盘服务。Cloudreve 支持多种存储介质&#xff0c;包括但不限于本地存储、阿里云OSS、…

Macs Fan Control - 控制 Apple 计算机上的风扇

免费下载 提供 macOS 和 Windows &#xff08;Boot Camp&#xff09; 版本 https://apsgo.cn/joN0WG Mac 风扇控制 监视和控制 Apple 计算机上的风扇 实时监控风扇速度和温度传感器&#xff0c;包括第三方 HDD/SSD&#xff08;使用 S.M.A.R.T.&#xff09;。设置自定义 RP…

3.STM32之通信接口《精讲》之USART通信

本节将进行实战&#xff0c;基础了解请查看第二节&#xff08;Whappy&#xff09;开始背&#xff01;&#xff01; USART ---》全双工 异步/同步 点对点 USART&#xff1a;STM32自带硬件电路&#xff0c;通过配置相对应的寄存器来设置数据帧的发送&#xff0c;我们收发只需要…

无插件H5播放器EasyPlayer.js网页web无插件播放器选择全屏时,视频区域并没有全屏问题的解决方案

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、MP3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

SPIRiT-Diffusion:基于自一致性驱动的加速MRI扩散模型|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 SPIRiT-Diffusion: Self-Consistency Driven Diffusion Model for Accelerated MRI SPIRiT-Diffusion&#xff1a;基于自一致性驱动的加速MRI扩散模型 01 文献速递介绍 磁共振成像&#xff08;MRI&#xff09; 在临床和研究领域被广泛应用。然而&#xff0c;其…