0-1背包、完全背包算法模板从递归到记忆化搜索到动态规划

0-1背包、完全背包算法模板从递归到记忆化搜索到动态规划

不管是0-1背包还是完全背包,我们都可以将问题转换成为选择或者不选的问题,这个问题在前面的回溯算法模板是一样的。
举个栗子:
假如有1、4、5这三个数,问组成和为12的数需要多少个?
这时候就是遍历这个数组,1需不需要 在原来的基础上 4 需不需要 ,5需不需要,经过多次比较之后能得到最终的结果。
题目:
在这里插入图片描述

# 递归 + 记忆化搜索(缓存)
class Solution {private int[] coins;private int[][] memo;public int coinChange(int[] coins, int amount) {this.coins = coins;int n = coins.length;memo = new int[n][amount + 1];for (int[] row : memo) {Arrays.fill(row, -1); // -1 表示没有访问过}int ans = dfs(n - 1, amount);return ans < Integer.MAX_VALUE / 2 ? ans : -1;}private int dfs(int i, int c) {if (i < 0) {return c == 0 ? 0 : Integer.MAX_VALUE / 2; // 除 2 防止下面 + 1 溢出}if (memo[i][c] != -1) { // 之前计算过return memo[i][c];}if (c < coins[i]) {return memo[i][c] = dfs(i - 1, c);}return memo[i][c] = Math.min(dfs(i - 1, c), dfs(i, c - coins[i]) + 1);}
}

题目基本上还是完全背包,主要看dfs的内容。
i 依次从数组的最后一个依次往前面走,走到当前这个位置有两种情况,分别是选和不选,如果是选当前的这个情况,由于当前这个硬币拿了之后,下一次仍然可能拿,所以我们下一次的起点仍然是i。另外一种情况是当前这种情况不拿,那么直接进入到下一个状态,也就是可以i - 1.
最后比较这两种状态哪一种状态需要的个数少。
注意点:

  1. 由于题目要求的是最少的,所以对于一些越界的情况,不可达的情况我们都设置成为最大值,之后这条路就不会进行选择。
  2. 需要注意第一个判断条件之后返回的情况

下一步:
单纯使用递归进行搜索,肯定会超时,这时候我们会在原来的接触上直接加上一个缓存,用于记录当前这个状态的结果吗,下一次计算这个位置的时候,就不用重新计算,直接进行拿就可以。
如果dfs中用到了几个变量,那么我们设置数组的时候基本上就是几维的。
下一步动态规划:

class Solution {public int coinChange(int[] coins, int amount) {int n = coins.length;int[][] f = new int[n + 1][amount + 1];Arrays.fill(f[0], Integer.MAX_VALUE / 2); // 除 2 防止下面 + 1 溢出f[0][0] = 0;for (int i = 0; i < n; i++) {for (int c = 0; c <= amount; c++) {if (c < coins[i]) f[i + 1][c] = f[i][c];else f[i + 1][c] = Math.min(f[i][c], f[i + 1][c - coins[i]] + 1);}}int ans = f[n][amount];return ans < Integer.MAX_VALUE / 2 ? ans : -1;}
}

到了这里就能发现是大家之前数值的递归方程,我们都会疑惑这个方程是从哪里来的,其实通过查看这个递归方程是不是和上面dfs上面的状态转移方程有点相似,其实是一样的。将我们原来每一步的操作转换成为填表的一个过程。

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

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

相关文章

202406 CCF-GESP Python 五级试题及详细答案注释

202406 CCF-GESP Python 五级试题及详细答案注释1 单选题(每题 2 分,共 30 分) 第 1 题 在Python中,print((c for c in "GESP"))的输出是( )。 A. (G, E, S, P) B. [G, E, S, P] C. {G, E, S, P} D. 以上选项均不正确答案:D解析:在Python中,(c for c in&q…

Keras实战之图像分类识别

文章目录 整体流程数据加载与预处理搭建网络模型优化网络模型学习率Drop-out操作权重初始化方法对比正则化加载模型进行测试 实战&#xff1a;利用Keras框架搭建神经网络模型实现基本图像分类识别&#xff0c;使用自己的数据集进行训练测试。 问&#xff1a;为什么选择Keras&am…

这门HCIE认证正式发布!

华为认证AI解决方案架构专家HCIE-AI Solution Architect V1.0&#xff08;中文版&#xff09;自2024年6月28日起&#xff0c;正式在中国区发布。 基于“平台生态”战略&#xff0c;围绕“云-管-端”协同的新ICT技术架构&#xff0c;华为公司打造了覆盖ICT领域的认证体系&#x…

C++ | Leetcode C++题解之第217题存在重复元素

题目&#xff1a; 题解&#xff1a; class Solution { public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> s;for (int x: nums) {if (s.find(x) ! s.end()) {return true;}s.insert(x);}return false;} };

2024年江苏省研究生数学建模科研创新实践大赛C题气象数据高精度融合技术研究论文和代码分析

经过不懈的努力&#xff0c; 2024年江苏省研究生数学建模科研创新实践大赛C题气象数据高精度融合技术研究论文和代码已完成&#xff0c;代码为C题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建…

Go 语言 UUID 库 google/uuid 源码解析:UUID version1 的实现

google/uuid 库地址 关于 UUID 的总体介绍可以查看这篇文章&#xff0c;其包含阅读此篇文章的前置内容。 UUID version 1 在 RFC 4122 文件中定义&#xff0c;其实现基于节点 ID、时钟序列以及当前时间&#xff08;距离格里历改日【1582年10月15日】 的100纳秒数&#xff0c;具…

服务器BMC基础知识总结

前言 因为对硬件方面不太理解&#xff0c;所以打算先从服务器开始学习&#xff0c;也想和大家一起分享一下&#xff0c;有什么不对的地方可以纠正一下哦&#xff01;谢谢啦&#xff01;互相学习共同成长~ 1.BMC是什么&#xff1f; 官方解释&#xff1a;BMC全名Baseboard Mana…

【深度学习】-WASB-调试说明

要改这么几个地方&#xff1a; 代码仓库&#xff1a;/Desktop/code/python_project/WASB-SBDT-main/ 篮球数据集xx_xx_11.xml只保留最后一个11.xml 并把11下直接放置11 video&#xff1a; 这里的东西被我改了&#xff0c;要以仓库为准

SpringSecurity中文文档(Servlet X.509 Run-As)

X.509 Authentication X. 509证书身份验证的最常见用途是在使用 SSL 时验证服务器的身份&#xff0c;最常见的用法是在浏览器中使用 HTTPS。浏览器会自动检查服务器提供的证书是否已由其维护的受信任证书颁发机构列表中的一个颁发(数字签名)。 您还可以使用带有“相互身份验证…

Java与Selenium配置及常见报错解决方法

Java与Selenium配置及常见报错解决方法 1. 简介 Java与Selenium是自动化测试中常用的工具和技术。正确配置开发环境并处理可能出现的问题&#xff0c;对于顺利开展测试工作至关重要。本文将为您详细介绍Java与Selenium的配置过程&#xff0c;并提供常见报错的解决方法。 2. …

中英双语介绍英国伟大的作家:查尔斯·狄更斯(Charles Dickens)

中文版 查尔斯狄更斯简介 查尔斯狄更斯&#xff08;Charles Dickens&#xff0c;1812年2月7日&#xff0d;1870年6月9日&#xff09;是19世纪英国最著名的小说家之一&#xff0c;以其丰富的文学作品和独特的写作风格闻名于世。他的作品不仅在文学界具有重要地位&#xff0c;而…

SpringSecurity中@PreAuthorize(“hasRole(‘ROLE_USER‘)“) 不起作用的原因

PreAuthorize(“hasRole(‘ROLE_USER’)”) 不起作用的原因可能确实是用户信息中没有包含正确的角色信息&#xff0c;但也可能由其他几个因素导致。以下是一些可能的原因&#xff1a; 1、用户信息中确实没有角色信息&#xff1a; 如果 Authentication 对象中的 GrantedAuthor…

一气之下,关闭成都400多人的游戏公司

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 最近&#xff0c;多益网络宣布关闭成都公司&#xff0c;在未来三年内&#xff0c;关闭成都所有的相关公司。原因竟然是输掉了劳动仲裁&#xff0c;赔偿员工38万多&#xff0c;然后一气之下要退出成都&#xff0c;…

【Python】简易书籍管理程序

之前简单介绍了有关Python的面向对象中的类&#xff0c;这次就围绕"类"和json格式来做一个简单的代码程序&#xff0c;并且在后面还附带了数据。 import json import re import timeclass BookManager:def __init__(self):self.books {} # 使用字典存储书籍信息&a…

Python基础之协程

文章目录 1 协程1.1 简介1.2 协程优势&分类1.2.1 优势1.2.2 分类 1.3 generator协程1.4 gevent协程1.5 asyncio1.5.1 简介1.5.2 asyncio函数1.5.3 async\await1.5.4 asyncio基本操作1.5.4.1 asyncio协程对象1.5.4.2 task对象1.5.4.3 future对象1.5.4.4 绑定回调1.5.4.5 异步…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日聚会(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

使用antd的<Form/>组件获取富文本编辑器输入的数据

前端开发中&#xff0c;嵌入富文本编辑器时&#xff0c;可以通过富文本编辑器自身的事件处理函数将数据传输给后端。有时候&#xff0c;场景稍微复杂点&#xff0c;比如一个输入页面除了要保存富文本编辑器的内容到后端&#xff0c;可能还有一些其他输入组件获取到的数据也一并…

Mac搭建anaconda环境并安装深度学习库

1. 下载anaconda安装包 根据自己的操作系统不同&#xff0c;选择不同的安装包Anaconda3-2024.06-1-MacOSX-x86_64.pkg&#xff0c;我用的还是旧的intel所以下载这个&#xff0c;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/&#xff0c;如果mac用的是M1&#xff0…

GuLi商城-商品服务-API-品牌管理-云存储开通与使用

这里学习下阿里云对象存储 地址&#xff1a;对象存储 OSS_云存储服务_企业数据管理_存储-阿里云 登录支付宝账号&#xff0c;找到了我以前开通的阿里云对象存储 熟悉下API 文档中心 简介_对象存储(OSS)-阿里云帮助中心 我们将用这种方式上传阿里云OSS

SprongBoot3整合Knife4j实现在线接口文档

大家好&#xff0c;我是晓凡。 写在前面 在上一篇文章&#xff0c;我们详细介绍了SpringBoot3 怎么整合SpringDoc实现在线接口文档。但是&#xff0c;有不少小伙伴 都觉得接口界面太丑了。有没有什么更美观一点的UI界面呢&#xff1f; 当然是有的了&#xff0c;毕竟这是一个…