动态规划 - 背包问题 - 完全背包

完全背包物品数量无限制,可以使用多次的实现方式:背包正序遍历

0-1背包:先物品后背包,物品正序、背包倒序(保证每个物品只用一次)

完全背包:先后顺序都可以,物品正序、背包正序

如果求组合数就是先物品,后背包

如果求排列数就是先背包,后物品

518. 零钱兑换 II: 组合数dp += dp[j-x](组合)

中等

给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。

假设每一种面额的硬币有无限个。 

题目数据保证结果符合 32 位带符号整数。

dp数组定义的大小一般为(背包大小+1)

1、确定dp数组以及下标含义:dp[j]容量为j的背包能装多少种组合的硬币

2、递推公式:组合数--dp += dp[j-x]

3、初始化:dp[0] = 1

4、确定遍历顺序:如果求组合数就是先物品,后背包。如果求排列数就是先背包,后物品。

5、打印dp数组

class Solution:
    def change(self, amount: int, coins: List[int]) -> int:
        dp = [0] * (amount+1)
        dp[0] = 1
        for i,x in enumerate(coins):
            for j in range(x, amount+1):
                dp[j] = dp[j] + dp[j-x]
        return dp[amount]

377. 组合总和 Ⅳ: 组合数dp += dp[j-x](排列)

中等

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

⚠️题目问的是“组合”,但顺序不同就是不同的组合,本质还是排列 :先物品后背包

此时背包的范围由【x, target+1) 变为【1,target+1),所以在推导公式前要先判断 j >=x 

算法思想:抽象为完全背包问题,求容量为target的背包能装多少种排列的硬币

1、确定dp数组以及下标含义:dp[j]容量为j的背包能装多少种排列的元素

2、递推公式:组合数--dp += dp[j-x]

3、初始化:dp[0] = 1

4、确定遍历顺序:如果求组合数就是先物品,后背包。如果求排列数就是先背包,后物品。

5、打印dp数组

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        dp = [0]*(target+1)
        dp[0] = 1
        for j in range(1,target+1): # 排列问题先背包再物品
            for i,x in enumerate(nums):
                # 防止访问超出范围的索引
                if j>=x: 
                    dp[j] += dp[j-x]
        return dp[target]
        

322. 零钱兑换 : 最小物品数 min()

中等

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

算法思想:抽象为完全背包,求容量为amount的背包最少需要多少个硬币能装满。

1、确认dp数组及其下标含义:dp[j] 容量为j的背包最少需要个物品能够装满

2、确定递推公式:dp[j] = min(dp[j], dp[j-x]+1) :凑足总额为j - x的最少个数为dp[j - x],那么只需要加上一个钱币coins[i]即dp[j - x] + 1就是dp[j]

3、初始化:dp[0] = 0,其他下标的dp[j]必须初始化为一个最大的数,不然结果会被初始值覆盖

4、打印

⚠️:其他下标的dp[j]必须初始化为一个最大的数,不然结果会被初始值覆盖

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [inf]*(amount+1)
        dp[0] = 0
        for i,x in enumerate(coins):
            for j in range(x, amount+1):
                dp[j] = min(dp[j], dp[j-x]+1)
        return dp[amount] if dp[amount] != inf else -1

279. 完全平方数: 最小物品数 min()

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149 和 16 都是完全平方数,而 3 和 11 不是。

 

算法思想:抽象为完全背包,求容量为n的背包最少需要多少个完全平方数能装满。

1、确认dp数组及其下标含义:dp[j] 容量为j的背包最少需要个物品能够装满

2、确定递推公式:dp[j] = min(dp[j], dp[j-x]+1) :凑足总额为j - x的最少个数为dp[j - x],那么只需要加上一个钱币coins[i]即dp[j - x] + 1就是dp[j]

3、初始化:dp[0] = 0,其他下标的dp[j]必须初始化为一个最大的数,不然结果会被初始值覆盖

4、打印

⚠️:其他下标的dp[j]必须初始化为一个最大的数,不然结果会被初始值覆盖 

我自己的方法:

class Solution:
    def numSquares(self, n: int) -> int:
        # 求完全平方数的列表
        nums = []
        boundary = int(sqrt(n)) # 边界
        for i in range(1,boundary+1):
            num = i**2 # 求完全平方数
            nums.append(num)

        # 完全背包:动态规划求最小物品数
        dp = [inf]*(n+1) # 其他下表初始为最大数
        dp[0] = 0
        for i,x in enumerate(nums):
            for j in range(x,n+1):
                dp[j] = min(dp[j-x]+1,dp[j]) # 最小物品数的推导公式
        return dp[n]

优化:

class Solution:
    def numSquares(self, n: int) -> int:
        dp = [float('inf')] * (n + 1)
        dp[0] = 0

        for i in range(1, int(n ** 0.5) + 1):  # 遍历物品
            for j in range(i * i, n + 1):  # 遍历背包
                # 更新凑成数字 j 所需的最少完全平方数数量
                dp[j] = min(dp[j - i * i] + 1, dp[j])

        return dp[n]

139. 单词拆分 

中等

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。

拆分时可以重复使用字典中的单词,说明就是一个完全背包!

算法思想:抽象为完全背包背题,求是否能够装满背包

1、确认dp数组及其下标含义:dp[j] 长度为j的字符串,dp[j]为true,表示可以拆分为一个或多个在字典中出现的单词。

2、确定递推公式:如果确定dp[i] 是true,且 [i, j] 这个区间的子串出现在字典里,那么dp[j]一定是true。(i < j )。

if dp[i] and s[i:j] in wordSet:  # 检查是否可以分割
    dp[j] = True

3、初始化:dp[0] = true

4、打印

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        wordSet = set(wordDict)  # 使用集合提高查找效率
        dp = [False] * (len(s) + 1)
        dp[0] = True  # 空字符串可以被分割
        
        for j in range(1, len(s) + 1):
            for i in range(j):  # i 从 0 到 j-1
                if dp[i] and s[i:j] in wordSet:  # 检查是否可以分割
                    dp[j] = True
                    break  # 找到一个分割后可以提前结束
            
        return dp[len(s)]

 

 

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

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

相关文章

基于卷积神经网络的苹果病害识别与防治系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 苹果病害识别与防治系统&#xff0c;卷积神经网络&#xff0c;resnet50&#xff0c;mobilenet【pytorch框架&#xff0c;python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积…

appium+mumu模拟器 嚼碎菜鸟教程

1、android sdk 下载安装 下载地址&#xff1a;https://www.androiddevtools.cn/index.html# 选择版本&#xff1a;android sdk【sdk tools:installer_r24.4.1-windows.exe】 参考步骤&#xff1a;https://blog.csdn.net/2401_83004375/article/details/139300339 2、jdk 安装…

day11:磁盘管理

一&#xff0c;磁盘概述 磁盘概述 磁盘是一种持久性存储设备&#xff0c;用于存储操作系统、应用程序和数据。磁盘通常分为**机械硬盘&#xff08;HDD&#xff09;和固态硬盘&#xff08;SSD&#xff09;**两种&#xff0c;HDD 基于旋转的磁性盘片&#xff0c;而 SSD 基于闪存…

【WRF数据处理】基于GIS4WRF插件将geotiff数据转为tiff(geogrid,WPS所需数据)

【WRF数据处理】基于GIS4WRF插件将geotiff数据转为tiff&#xff08;geogrid&#xff0c;WPS所需数据&#xff09; 数据准备&#xff1a;以叶面积指数LAI为例QGis实操&#xff1a;基于GIS4WRF插件将geotiff数据转为tiff警告&#xff1a;GIS4WRF: Input layer had an unexpected …

ES8JC-ASEMI超快恢复二极管ES8JC

编辑&#xff1a;ll ES8JC-ASEMI超快恢复二极管ES8JC 型号&#xff1a;ES8JC 品牌&#xff1a;ASEMI 封装&#xff1a;SMC 安装方式&#xff1a;贴片 批号&#xff1a;最新 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;8A 最大循…

ECCV 2024论文分享┆Agent Attention: Softmax注意力和线性注意力的高效融合

简介 本推文主要介绍了由清华大学黄高老师团队发表在ECCV 2024上的一篇论文《Agent Attention: On the Integration of Softmax and Linear Attention》&#xff0c;文中提出了一种新型的代理注意力&#xff08;Agent Attention&#xff09;。近年来&#xff0c;Transformer在…

Github 2024-10-29Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-10-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1gpt4free存储库:强大语言模型的集合 创建周期:300 天开发语言:Python协议类型:GNU General Public License v3…

【Java】逻辑控制 —— 三大结构 和 猜数字游戏

目录 1. 顺序结构 2. 分支结构【与C略有不同】 2.1 if语句 2.2 switch语句 注意事项【与C不同】 3. 循环结构【与C略有不同】 3.1 while循环 * break和continue 3.2 for循环 3.3 do while循环 * 输入的判断&#xff08;hasNext&#xff09; 4. 猜数字游戏 1. 顺序结…

大文件秒传,分片上传,断点续传

大文件分片上传 一 功能描述 1.文件通过web端分片多线程上传到服务端&#xff0c;然后web端发起分片合并&#xff0c;完成大文件分片上传功能 2.上传过的大文件&#xff0c;实现秒传 3.上传过程中&#xff0c;服务异常退出&#xff0c;实现断点续传 二 流程图 三 代码运行…

【含开题报告+文档+PPT+源码】基于Java的社会公益平台

开题报告 随着社会的不断进步和人们公益意识的日益增强&#xff0c;社会公益事业在全球范围内得到了广泛的关注和参与。然而&#xff0c;传统的公益模式往往受到信息不对称、资源分散、管理效率低下等问题的困扰&#xff0c;导致公益活动的效果有限&#xff0c;难以满足社会的…

【C语言】C语言入门--函数

文章目录 前言一、函数的概念一、pandas是什么&#xff1f;二、库函数 1.标准库和头文件2.库函数的使用方法3.库函数文档的一般格式三、自定义函数四、形参和实参五、return语句六、数组做函数参数七、嵌套调用和链式访问 1.嵌套调用2.链式访问八、函数的声明和定义 1.单个文件…

C++在实际项目中的应用第二节:C++与区块链

第五章&#xff1a;C在实际项目中的应用 第二课&#xff1a;C与区块链 区块链技术因其去中心化、不可篡改和透明性而受到广泛关注。在这门课程中&#xff0c;我们将深入探讨区块链的基本原理、智能合约的开发以及实际应用的案例分析&#xff0c;重点使用 C 作为实现语言&…

微服务之网关、网关路由、网关登录校验

简介&#xff1a;来源&#xff1a;SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09; 认识网关 前端请求不能直接访问微服务&#xff0c;而是要请求网关&#xff1a; 网关可以做…

服务环境的搭建

一、基础环境搭建 1、python3 准备相关的jar包 Index of /ftp/python/3.7.9/ scp Python-3.7.9.tgz root192.168.1.245:/opt/dockerinstall/python3/ yum -y install gcc yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel…

【语音转文本新体验】Windows部署Whisper Web结合内网穿透轻松远程转录——“cpolar内网穿透”

文章目录 前言1.本地部署Whisper Web1.1 安装git1.2 安装Node.js1.3 运行项目 2. Whisper Web使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 公网访问测试6. 配置固定公网地址 前言 OpenAI开源的 Whisper 语音转文本模型效果都说还不错&#xff0c;今天就给大家推荐 GitHub…

[A-14]ARMv8/ARMv9-Memory-内存模型的类型(Device Normal)

ver0.1 [看前序文章有惊喜。] 前言 前面花了很大的精力把ARM构建的VMSA中的几个核心的议题给大家做了介绍,相信大家已经能够理解并掌握ARM的内存子系统的工作原理大致框架。接下来我们会规划一些文章,对ARM内存子系统的一些细节做一下介绍,使ARM的内存子系统更加的丰满。本…

JetBrains IDE中GPU进程(JCEF)重启问题(Too many restarts of GPU-process)解决方案

目录 前言1. GPU进程重启问题概述1.1 什么是GPU进程重启问题&#xff1f;1.2 该问题带来的影响 2. GPU进程重启问题的原因分析2.1 显卡驱动的兼容性问题2.2 系统资源的限制2.3 JCEF组件的设置不合理 3. 解决方案3.1 方法一&#xff1a;通过自定义属性禁用GPU加速3.2 方法二&…

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持UDP和TCP传输协议

随着科技的飞速发展&#xff0c;视频技术已成为现代社会不可或缺的一部分&#xff0c;广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。在这一背景下&#xff0c;NVR管理平台EasyNVR作为一款高效、灵活的视频监控管理系统&#xff0c;正经历着前所未有的发展机遇…

医学影像基础:常见的医学影像学术语和概念

目录 1. 基本影像术语 2. X射线相关术语 3. CT相关术语 4. MRI相关术语 5. 超声相关术语 6. 核医学相关术语 7. 影像质量和技术术语 8. 临床影像术语 总结 在医学影像学中&#xff0c;有许多术语和概念是常用且重要的。了解这些术语和概念有助于更好地理解影像报告、与…

稀土抗紫外屏蔽剂在化妆品上的应用

稀土抗紫外屏蔽剂的作用原理 稀土元素具有独特的电子结构&#xff0c;能够吸收和散射紫外线。其作用主要有以下几个方面&#xff1a; 1. 吸收紫外线&#xff1a;稀土元素可以吸收特定波长的紫外线&#xff0c;将其能量转化为热能或其他形式的能量&#xff0c;从而减少紫外线对…