代码随想录算法训练营day38

代码随想录算法训练营

—day38

文章目录

  • 代码随想录算法训练营
  • 前言
  • 一、322. 零钱兑换
    • 二维dp数组
  • 二、279.完全平方数
    • 二维dp数组
  • 三、139. 单词拆分
  • 多重背包
  • 背包问题总结
    • 问题类型
    • 递推公式
    • 遍历顺序


前言

今天是算法营的第38天,希望自己能够坚持下来!
今日任务:
● 322. 零钱兑换
● 279.完全平方数
● 139.单词拆分
● 关于多重背包,你该了解这些!


一、322. 零钱兑换

题目链接
文章讲解
视频讲解

二维dp数组

思路:
物品无限,完全背包问题。

  1. dp[j]:凑足总额为j所需钱币的最少个数为dp[j]
  2. 递归公式:对于物品i,有放和不放两种
    ①放的话就是 dp[j- weigiht[i]] + 1 (预留出硬币i的空间,加上1个硬币)
    ②不放的话就是保持dp[j]
    所以递推公式是两者取最小 dp[j] = min(dp[j], dp[j- weigiht[i]] + 1)
  3. 初始化:dp[0] = 0 凑成0金额需要0个硬币,其余需要初始化成int最大值,因为递推公式要求最小值
  4. 遍历顺序:因为求的是个数,不管是组合还是排列,最少的硬币个数都是一样的,所以遍历顺序没有关系

代码如下:

class Solution {
public://dp[j]:凑成j金额最少需要dp[j]个硬币//dp[j] = min(dp[j], dp[j - coins[i]] + 1)  不放硬币i + 放硬币i (预留出硬币i的空间,加上1个硬币)//初始化:dp[0] = 0 凑成0金额需要0个硬币,其余需要初始化成int最大值,因为递推公式要求最小值//遍历顺序:因为求的是个数,不管是组合还是排列,最少的硬币个数都是一样的,所以遍历顺序没有关系int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, INT_MAX);dp[0] = 0;for (int i = 0; i < coins.size();i++) { //遍历物品for (int j = coins[i]; j <= amount; j++) { //遍历背包if (dp[j - coins[i]] != INT_MAX) //如果等于初始值则跳过dp[j] = min(dp[j], dp[j - coins[i]] + 1); //不跳过的话这里+1会超int}}return dp[amount] == INT_MAX? -1:dp[amount];}
};

二、279.完全平方数

题目链接
文章讲解
视频讲解

二维dp数组

思路:
完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?也就是完全背包的问题。思路跟动态规划:322. 零钱兑换是一样的,区别就是递推公式中,物品i的重量是i*i

  1. dp[j]:和为j的完全平方数的最少数量
  2. 递归公式:dp[j] = min(dp[j], dp[j - ii] + 1) 物品i放的话,腾出ii的位置,数量再+1
  3. 初始化:dp[0] = 0 ,其余需要初始化成int最大值,因为递推公式要求最小值
  4. 遍历顺序:因为求的是个数,不管是组合还是排列,最少的硬币个数都是一样的,所以遍历顺序没有关系

代码如下:

class Solution {
public://dp[j]:和为j的完全平方数的最少数量//dp[j] = min(dp[j], dp[j - i*i] + 1)int numSquares(int n) {vector<int> dp(n+1, INT_MAX);dp[0] = 0;for (int i = 1; i*i <= n; i++) {for (int j = i*i; j <= n; j++) {dp[j] = min(dp[j], dp[j - i*i] + 1);}}return dp[n]; //这里不需要判断INT_MAX,因为1就是完全平方数,不管n是什么,都可以用1来组成}
};

三、139. 单词拆分

题目链接
文章讲解
视频讲解

思路:
把字符串s当成 背包,字典里的单词是物品,能重复使用,完全背包问题

  1. dp[i]:长度为i的字符串可以由字符串列表拼成,因为求的是可以拼成,所以用 bool,dp[j]=true ,求dp[s.size()]
  2. 递推公式:if (dp[i] && 截取[j,i]区间的字符串可以在字典中找到) dp[i] = true (i前面的都可以拼成,且剩下部分也是字典有的单词)
  3. 初始化:dp[0] =true其余为false ,不然递推公式一直都是false
  4. 遍历顺序:因为对顺序有要求,所以要先遍历背包
  5. 举例推导dp数组:
    以输入: s = “leetcode”, wordDict = [“leet”, “code”]为例,dp状态如图:

在这里插入图片描述

代码如下:

class Solution {
public://把字符串s当成 背包,字典里的单词是物品,能重复使用,完全背包问题//dp[i]:长度为i的字符串可以由字符串列表拼成,dp[i]=true ,求dp[s.size()]//递推公式:if (dp[i] && 截取[j,i]区间的字符串可以在字典中找到) dp[i] = true (i前面的都可以拼成,且剩下部分也是字典有的单词)//初始化:dp[0] =true其余为false ,不然递推公式一直都是false//遍历顺序:因为对顺序有要求,所以要先遍历背包bool wordBreak(string s, vector<string>& wordDict) {//需要转成set用find来判断字符串是否在字典里unordered_set<string>wordSet (wordDict.begin(), wordDict.end());vector<bool> dp(s.size() + 1, false);dp[0] = true;//每次截取[j,i]的字符串来判断,先固定右区间i,左区间j在内循环中移动for (int i = 1; i <= s.size(); i++) { //先遍历背包for (int j = 0; j < i; j++) { //遍历物品string word = s.substr(j, i - j); //substr(起始位置int,截取的个数int)if (wordSet.find(word) != wordSet.end() && dp[j]) {dp[i] = true;}}}return dp[s.size()];}
};

多重背包

题目链接
文章讲解
视频讲解

定义:
多重背包就是每个物品的数量都不一样。

思路:
可以将物品的数量展开,看成是每个物品的数量为1。
在这里插入图片描述
转化成数量1:
在这里插入图片描述
代码如下:

// 超时了
#include<iostream>
#include<vector>
using namespace std;
int main() {int bagWeight,n;cin >> bagWeight >> n;vector<int> weight(n, 0); vector<int> value(n, 0);vector<int> nums(n, 0);for (int i = 0; i < n; i++) cin >> weight[i];for (int i = 0; i < n; i++) cin >> value[i];for (int i = 0; i < n; i++) cin >> nums[i];    for (int i = 0; i < n; i++) {while (nums[i] > 1) { // 物品数量不是一的,都展开weight.push_back(weight[i]);value.push_back(value[i]);nums[i]--;}}vector<int> dp(bagWeight + 1, 0);for(int i = 0; i < weight.size(); i++) { // 遍历物品,注意此时的物品数量不是nfor(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}}cout << dp[bagWeight] << endl;
}

但这种方法会超时,主要是因为,当物品数量很多的时候,将物品数量展开的时候 ,vector的动态底层扩容会非常耗时。

方法二:
再多加一个for循环来遍历分别放[1,num[i]]个物品的情况,取最大值

#include<iostream>
#include<vector>
using namespace std;
int main() {int bagWeight,n;cin >> bagWeight >> n;vector<int> weight(n, 0);vector<int> value(n, 0);vector<int> nums(n, 0);for (int i = 0; i < n; i++) cin >> weight[i];for (int i = 0; i < n; i++) cin >> value[i];for (int i = 0; i < n; i++) cin >> nums[i];vector<int> dp(bagWeight + 1, 0);for(int i = 0; i < n; i++) { // 遍历物品for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量// 以上为01背包,然后加一个遍历个数for (int k = 1; k <= nums[i] && (j - k * weight[i]) >= 0; k++) { // 遍历个数dp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i]);}}}cout << dp[bagWeight] << endl;
}

背包问题总结

问题类型

给定一个的背包(容器),一些物品,物品有自己的重量和价值,
求放满背包(容器),
1.最大价值 2.有多少种方法 3.最少放多少个物品

物品只能放一次:01背包
物品无限放入:完全背包
物品数量不一:多重背包

递推公式

总体就是围绕着对于当前物品i,放或者不放,然后取最大值或最小值,或者两种情况相加。
放则预留出物品i的空间 dp[j - 物品i重量],再根据dp定义,

  1. 能否装满背包(或者最多装多少),那么放物品i就是dp[j-物品i重量] + 物品i价值
    dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
  • 动态规划:416.分割等和子集
  • 动态规划:1049.最后一块石头的重量 II
  1. 求的装满背包有几种方法,就直接是dp[j-物品i重量]
    dp[j] += dp[j - nums[i]]
  • 动态规划:494.目标和
  • 动态规划:518. 零钱兑换
  • 动态规划:377.组合总和Ⅳ
  • 动态规划:70. 爬楼梯进阶版(完全背包)
  1. 求的是装满背包所有物品的最小个数,则是dp[j-物品i重量]+1(物品i)
    dp[j] = min(dp[j - coins[i]] + 1, dp[j])
  • 动态规划:322.零钱兑换
  • 动态规划:279.完全平方数

遍历顺序

  1. 01背包,用一维数组必须先遍历物品,然后背包后序遍历
  2. 完全背包,如果求的是组合数,一维数组必须先遍历物品,背包正序遍历
  3. 完全背包,如果求的是排列数,一维数组必须先遍历背包,再遍历物品
  4. . 完全背包,如果求的是最大价值,一维数组两种遍历顺序都可以

在这里插入图片描述

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

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

相关文章

数据库高安全—审计追踪:传统审计统一审计

书接上文数据库高安全—角色权限&#xff1a;权限管理&权限检查&#xff0c;从权限管理和权限检查方面解读了高斯数据库的角色权限&#xff0c;本篇将从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读。 4 审计追踪 4.1 传统审计 审计内容的记录方式通…

【C++篇】 异常处理

目录 1&#xff0c;异常的概念及使用 1.1&#xff0c;异常的概念 1.2&#xff0c;异常的抛出和捕获 1.3&#xff0c;栈展开 1.4&#xff0c;异常的重新抛出 1.5&#xff0c;异常安全问题 1.6&#xff0c;异常规范 2&#xff0c;标准库中的异常 小结&#xff1a; 1&…

QT修仙之路1-1--遇见QT

文章目录 遇见QT二、QT概述2.1 定义与功能2.2 跨平台特性2.3 优点汇总 三、软件安装四、QT工具介绍(重要)4.1 Assistant4.2 Designer4.3 uic.exe4.4 moc.exe4.5 rcc.exe4.6 qmake4.7 QTcreater 五、QT工程项目解析(作业)5.1 配置文件&#xff08;.pro&#xff09;5.2 头文件&am…

python实现情绪识别模块,并将模块封装成可执行文件

目录&#xff1a; 1.源码&#xff1a;2.情绪识别模型运行流程&#xff1a;3.模型封装需要注意的地方&#xff1a;4.未解决问题&#xff1a; 1.源码&#xff1a; https://gitcode.com/xyint/deep_learning.git 2.情绪识别模型运行流程&#xff1a; 需要获取用户摄像头权限&…

网络防御高级02-综合实验

web页面&#xff1a; [FW]interface GigabitEthernet 0/0/0 [FW-GigabitEthernet0/0/0]service-manage all permit 需求一&#xff0c;接口配置&#xff1a; SW2: [Huawei]sysname SW2 1.创建vlan [sw2]vlan 10 [sw2]vlan 20 2.接口配置 [sw2]interface GigabitEther…

Arbess基础教程-创建流水线

Arbess(谐音阿尔卑斯) 是一款开源免费的 CI/CD 工具&#xff0c;本文将介绍如何使用 Arbess 配置你的第一条流水线&#xff0c;以快速入门上手。 1. 创建流水线 根据不同需求来创建不同的流水线。 1.1 配置基本信息 配置流水线的基本信息&#xff0c;如分组&#xff0c;环境&…

MySQL下载过程

MySQL Enterprise Edition Downloads | Oracle mysql官方下载网址&#xff08;9.2版本&#xff09; 下面的示例是5.7的包&#xff0c;过程是一样的 port&#xff1a;3308&#xff08;默认的是3306&#xff0c;笔者下了一个占用了该端口&#xff09; root&#xff1a;123456 问题…

StochSync:可在任意空间中生成360°全景图和3D网格纹理

StochSync方法可以用于在任意空间中生成图像&#xff0c;尤其是360全景图和3D网格纹理。该方法利用了预训练的图像扩散模型&#xff0c;以实现零-shot生成&#xff0c;消除了对新数据收集和单独训练生成模型的需求。StochSync 结合了 Diffusion Synchronization&#xff08;DS&…

Windows逆向工程入门之汇编环境搭建

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 Visual Studio逆向工程配置 基础环境搭建 Visual Studio 官方下载地址安装配置选项(后期可随时通过VS调整) 使用C的桌面开发 拓展可选选项 MASM汇编框架 配置MASM汇编项目 创建新项目 选择空…

【多模态大模型】系列1:CLIP【多模态领域开山之作】

目录 1 模型结构2 伪代码3 Loss计算方法 官方网站&#xff1a;https://openai.com/index/clip/ 论文&#xff1a;Learning Transferable Visual Models From Natural Language Supervision GitHub&#xff1a;https://github.com/openai/CLIP Colab&#xff1a;https://colab.r…

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现 目录 SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来&#xff08;优…

idea整合deepseek实现AI辅助编程

1.File->Settings 2.安装插件codegpt 3.注册deepseek开发者账号&#xff0c;DeepSeek开放平台 4.按下图指示创建API KEY 5.回到idea配置api信息&#xff0c;File->Settings->Tools->CodeGPT->Providers->Custom OpenAI API key填写deepseek的api key Chat…

k8s部署elasticsearch

前置环境&#xff1a;已部署k8s集群&#xff0c;ip地址为 192.168.10.1~192.168.10.5&#xff0c;总共5台机器。 1. 创建provisioner制备器&#xff08;如果已存在&#xff0c;则不需要&#xff09; 制备器的具体部署方式&#xff0c;参考我之前的文章&#xff1a;k8s部署rab…

(done) openMP学习 (Day13: 线程私有数据和如何支持库(Pi again),蒙特卡洛计算 Pi,线性同余法)

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#23-%E5%8F%AF%E6%80%95%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Batomicsflushpairwise%E5%90%8C%E6%AD%A5%20 视频&#xff1a;https://www.bilibili.com/video/BV1SW411s7ST?s…

借助AI,轻松读好书

读书笔记 AI可以帮助我们写读书笔记&#xff0c;通过智能化的分类和标注技术&#xff0c;将我们的笔记进行分类整理&#xff0c;使其更加清晰易懂&#xff0c;帮助我们高效&#xff0c;准确&#xff0c;深入的总结和掌握书中的知识&#xff0c;实现更好的学习和成长。 《异类》…

【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;语言模型的发展历程&#xff1a;从统计方法到大规模预训练模型的演化1 统计语言模型&#xff08;Statistical Language Model, SLM&#xff09;&#xff1a;统…

活动预告 |【Part1】Microsoft Azure 在线技术公开课:基础知识

课程介绍 参加“Azure 在线技术公开课&#xff1a;基础知识”活动&#xff0c;培养有助于创造新的技术可能性的技能并探索基础云概念。参加我们举办的本次免费培训活动&#xff0c;扩充自身的云模型和云服务类型知识。你还可以查看以计算、网络和存储为核心的 Azure 服务。 活…

python 语音识别方案对比

目录 一、语音识别 二、代码实践 2.1 使用vosk三方库 2.2 使用SpeechRecognition 2.3 使用Whisper 一、语音识别 今天识别了别人做的这个app,觉得虽然是个日记app 但是用来学英语也挺好的,能进行语音识别,然后矫正语法,自己说的时候 ,实在不知道怎么说可以先乱说,然…

C# OpenCvSharp 部署MOWA:多合一图像扭曲模型

目录 说明 效果 项目 代码 下载 参考 C# OpenCvSharp 部署MOWA&#xff1a;多合一图像扭曲模型 说明 算法模型的paper名称是《MOWA: Multiple-in-One Image Warping Model》 ariv链接 https://arxiv.org/pdf/2404.10716 效果 Stitched Image 翻译成中文意思是&…

【Java】线上故障排查实战

引言 JVM命令详细可以看前一篇文章&#xff0c;本篇文章基于之前的命令做一次简单的线上故障排查分析 JVM常见命令 实战 1. 一般显示都是Linux系统&#xff0c;我们排查winodows系统想知道CPU和内存使用情况&#xff0c;打开任务管理器就可以出现图形化界面&#xff0c;而L…