[Algorithm][动态规划][完全背包问题][零钱兑换][零钱兑换Ⅱ][完全平方数]详细讲解

目录

  • 1.零钱兑换
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.零钱兑换 II
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.完全平方数
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


1.零钱兑换

1.题目链接

  • 零钱兑换

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i][j]的含义

      • dp[i][j]:从前i个硬币中****,总和正好等于j,最少的硬币个数
    • 推导状态转移方程:根据最后一个位置的情况,分情况讨论

      • 状态转移方程优化同[模板]完全背包
        请添加图片描述
    • 初始化:

      • 多开一行及一列虚拟结点
      • 由于此处状态方程求的是min,为了让不存在的情况不影响取值
        • 可以在不存在的情况初始化为无穷大,此处无穷大初始化为0x3f3f3f3f
          请添加图片描述
    • 确定填表顺序:从上往下,从左往右

    • 确定返回值:dp[n][amount] >= INF ? -1 : dp[n][amount]

  • 滚动数字优化同[模板]完全背包

3.代码实现

// v1.0
int coinChange(vector<int>& coins, int amount) 
{const int INF = 0x3f3f3f3f;int n = coins.size();vector<vector<int>> dp(n + 1, vector<int>(amount + 1));// Initfor(int j = 1; j <= amount; j++){dp[0][j] = INF;}// DPfor(int i = 1; i <= n; i++){for(int j = 0; j <= amount; j++){dp[i][j] = dp[i - 1][j];if(j >= coins[i - 1]){dp[i][j] = min(dp[i][j], dp[i][j - coins[i - 1]] + 1);}}}return dp[n][amount] >= INF ? -1 : dp[n][amount];
}
-------------------------------------------------------------------------
// v2.0 滚动数组优化
int coinChange(vector<int>& coins, int amount) 
{const int INF = 0x3f3f3f3f;int n = coins.size();vector<int> dp(amount + 1, INF);dp[0] = 0;// DPfor(int i = 1; i <= n; i++){for(int j = coins[i - 1]; j <= amount; j++){dp[j] = min(dp[j], dp[j - coins[i - 1]] + 1);}}return dp[amount] >= INF ? -1 : dp[amount];
}

2.零钱兑换 II

1.题目链接

  • 零钱兑换 II

2.算法原理详解

  • 思路基本跟零钱兑换一致,本题代码实现就只给出滚动数组优化的版本
  • 思路
    • 确定状态表示 -> dp[i][j]的含义

      • dp[i][j]:从前i个硬币中****,总和正好等于j,一共有多少种选法
    • 推导状态转移方程:根据最后一个位置的情况,分情况讨论

      • 状态转移方程优化同[模板]完全背包
        请添加图片描述
    • 初始化:

      • 多开一行及一列虚拟结点
        请添加图片描述
    • 确定填表顺序:从上往下,从左往右

    • 确定返回值:dp[n][amount]

  • 滚动数字优化同[模板]完全背包

3.代码实现

int change(int amount, vector<int>& coins) 
{vector<int> dp(amount + 1);dp[0] = 1;for(int i = 1; i <= coins.size(); i++){for(int j = coins[i - 1]; j <= amount; j++){dp[j] += dp[j - coins[i - 1]];}}return dp[amount];
}

3.完全平方数

1.题目链接

  • 完全平方数

2.算法原理详解

  • 问题转化:本质就是完全背包问题
  • 思路
    • 确定状态表示 -> dp[i][j]的含义

      • dp[i][j]:从前i个完全平方数中****,总和正好等于j,所有的选法中,最小的数量
    • 推导状态转移方程:根据最后一个位置的情况,分情况讨论

      • 状态转移方程优化同[模板]完全背包
        请添加图片描述
    • 初始化:

      • 多开一行及一列虚拟结点
      • 由于此处状态方程求的是min,为了让不存在的情况不影响取值
        • 可以在不存在的情况初始化为无穷大,此处无穷大初始化为0x3f3f3f3f
          请添加图片描述
    • 确定填表顺序:从上往下,从左往右

    • 确定返回值:dp[sqrt(n)][n]

  • 滚动数字优化同[模板]完全背包

3.代码实现

// v1.0
int numSquares(int n) 
{const int INF = 0x3f3f3f3f;int m = sqrt(n);vector<vector<int>> dp(m + 1, vector<int>(n + 1));// Initfor(int j = 1; j <= n; j++){dp[0][j] = INF;}// DPfor(int i = 1; i <= m; i++){for(int j = 0; j <= n; j++){dp[i][j] = dp[i - 1][j];if(j >= i * i){dp[i][j] = min(dp[i][j], dp[i][j - i * i] + 1);}}}return dp[m][n];
}
-------------------------------------------------------------------------
// v2.0 滚动数组优化
int numSquares(int n) 
{const int INF = 0x3f3f3f3f;int m = sqrt(n);vector<int> dp(n + 1, INF);dp[0] = 0;// DPfor(int i = 1; i <= m; i++){for(int j = i * i; j <= n; j++){dp[j] = min(dp[j], dp[j - i * i] + 1);}}return dp[n];
}

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

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

相关文章

QSqlDatabase、QSqlQuery、QSqlRecord、Sqlite用法

使用QSqlDatabase、QSqlQuery、QSqlRecord、Sqlite数据库实现一个简单的界面查询 1. 创建Sqlite数据库&#xff0c;表 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "QSqlDatabase" #include "QSqlQuery&q…

【计算机毕业设计】273基于微信小程序的刷题系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

MySQL8基于GTID以及VIP实现高可用主从架构

jdbc客户端配置高可用以及故障切换 jdbc客户端实现故障切换 MySQL Connector/J 支持服务器故障转移。当底层活动连接发生与连接相关的错误时&#xff0c;就会发生故障转移 参考官网地址 jdbc:mysql://[primary host][:port],[secondary host 1][:port] jdbc客户端实现故障切…

vAttention:用于在没有Paged Attention的情况下Serving LLM

文章目录 0x0. 前言&#xff08;太长不看版&#xff09;0x1. 摘要0x2. 介绍&背景0x3. 使用PagedAttention模型的问题0x3.1 需要重写注意力kernel0x3.2 在服务框架中增加冗余0x3.3 性能开销0x3.3.1 GPU上的运行时开销0x3.3.2 CPU上的运行时开销 0x4. 对LLM服务系统的洞察0x5…

自动驾驶跟驰仿真

联合仿真需求分析报告 一、项目背景 随着汽车技术的快速发展&#xff0c;自动驾驶和智能网联汽车已成为行业发展的重要趋势。为确保自动驾驶车辆在复杂交通环境中的安全性和可靠性&#xff0c;进行联合仿真测试显得尤为重要。本报告旨在明确联合仿真的具体需求&#xff0c;为…

Springboot结合redis实现关注推送

关注推送 Feed流的模式 Timeline:不做内容筛选&#xff0c;简单的按照内容发布时间排序。常用于好友与关注。例如朋友圈的时间发布排序。 优点:信息全面&#xff0c;不会有缺失。并且实现也相对简单 缺点:信息噪音较多&#xff0c;用户不一定感兴趣&#xff0c;内容获取效率…

佳能5DMARK IV mov视频覆盖的恢复方法

5DMARK IV算是佳能比较经典的一款摄像机&#xff0c;是佳能早期使用MOV的摄像机之一&#xff0c;MOV是当初佳能高端机的象征&#xff0c;当然现在佳能已经不在通过MOV和MP4来区分硬件级别了。下边这个案例是文件拍摄时断电&#xff0c;结果变成0字节&#xff0c;然后覆盖了部分…

速度位置规划实现精确定位的问题

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

论文略读:Onthe Expressivity Role of LayerNorm in Transformers’ Attention

ACL 2023 研究了LayerNorm在 Transformers 中对注意力的作用LayerNorm为Transformer的Attention提供了两个重要的功能&#xff1a; 投影&#xff0c;projection LayerNorm 帮助 Attention 设计一个注意力查询&#xff0c;这样所有的Key都可以平等地访问通过将Key向量投影到同一…

端午节到了,祝大家粽子甜甜,生活美满!愿粉丝们心想事成,健康平安,阖家幸福!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【Java基础】多线程开发

Java多线程编程学习笔记 Author: Jim.kk Video: Bilibili 文章目录 Java多线程编程学习笔记学习路线简介程序、进程与线程的关系JVM简介 | 多线程在JVM中的执行示例CPU 线程的调度方式多线程的意义并行与并发 创建多线程 1 | Thread 与 Runnable方式 1 | 继承 Thread 类方式 …

企业网站策划

企业网站策划是企业推广和宣传的重要组成部分&#xff0c;它不仅是企业对外传达形象和信息的平台&#xff0c;更是企业与客户、供应商、合作伙伴进行交流和互动的重要工具。好的企业网站策划不仅能够展示企业形象和产品信息&#xff0c;还能够为用户提供更好的体验&#xff0c;…

Java:集合框架

1.Collection接口 collection接口是Java最基本的集合接口&#xff0c;它定义了一组允许重复的对象。它虽然不能直接创建实例&#xff0c;但是它派生了两个字接口List和Set&#xff0c;可以使用子接口的实现类创建实例。Collection 接口是抽取List接口和Set接口共同的存储特点和…

九种mfc140u.dll丢失的解决方法,全面解决mfc140u.dll文件丢失

mfc140u.dll是 Microsoft Visual C 2015 Redistributable 的一部分&#xff0c;它与 Microsoft 基础类库&#xff08;MFC&#xff09;的 Unicode 版本有关。当您在运行使用 Visual C 2015 开发的应用程序时&#xff0c;可能会碰到关于mfc140u.dll丢失的错误。下面列出了一些解决…

刷机维修进阶教程-----红米k30 nv损坏故障 修复实例教程步骤解析

小米红米系列机型在米8起始就有了串码校验。不得随意更改参数限制。不同于其他机型,可以任意刷入同芯片的基带qcn来修复基带和串码丢失。米系列刷入同芯片基带qcn会提示nv损坏故障。是因为有串码校验。一般在于格机或者全檫除分区后写新参数出现的故障。 这种解决方法通常有两…

Nginx+Tomcat负载均衡,动静分离群集

Nginx反向代理原理 Nginx 反向代理&#xff1a;将Nginx接收到的请求转发给其它应用服务器处理 Nginx 负载均衡&#xff1a;通过反向代理实现&#xff0c;还可以将nginx接收到的请求转发给多个后端应用服务器处理 Nginx 动静分离&#xff1a;静态页面请求&#xff0c;由nginx…

上汽集团25届暑期实习测评校招笔试题库已发(真题)

&#x1f4e3;上汽集团 25届暑期实习测评已发&#xff0c;正在申请的小伙伴看过来哦&#x1f440; ㊙️本次实习项目面向2025届国内外毕业生&#xff0c;开放了新媒体运营、销售策略、市场运营、物流、质量分析等岗位~ ✅测评讲解&#xff1a; &#x1f449;测评自收到起需在…

Linux---防火墙

文章目录 目录 文章目录 前言 一.静态防火墙&#xff1a;iptables iptables五链 iptables 四表 iptables控制类型 iptables命令配置 前言 这儿主要介绍Linux系统本身提供的软件防火墙的功能&#xff0c;即数据包过滤机制。 数据包过滤&#xff0c;也就是分析进入主机的网络数…

cve_2022_0543-redis沙盒漏洞复现 vulfocus

1. 原理 该漏洞的存在是因为Debian/Ubuntu中的Lua库是作为动态库提供的。自动填充了一个package变量&#xff0c;该变量又允许访问任意 Lua 功能。 2.复现 我们可以尝试payload&#xff1a; eval local io_l package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so…

DeepSpeed MoE

MoE概念 模型参数增加很多&#xff1b;计算量没有增加&#xff08;gating小FNN&#xff0c;比以前的大FNN计算量要小&#xff09;&#xff1b;收敛速度变快&#xff1b; 效果&#xff1a;PR-MoE > 普通MoE > DenseTransformer MoE模型&#xff0c;可视为Sparse Model&…