[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));

    // Init
    for(int j = 1; j <= amount; j++)
    {
        dp[0][j] = INF;
    }

    // DP
    for(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;

    // DP
    for(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));

    // Init
    for(int j = 1; j <= n; j++)
    {
        dp[0][j] = INF;
    }

    // DP
    for(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;

    // DP
    for(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];
}

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

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

相关文章

Gitlab安装配置

gitlab git是一个分布式的代码版本管理软件。用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 1.版本控制 是指对软件开发过程中各种程序代码&#xff0c;配置文件及说明文档等文件变更的管…

如何用R语言ggplot2画高水平期刊散点图

文章目录 前言一、数据集二、ggplot2画图1、全部代码2、细节拆分1&#xff09;导包2&#xff09;创建图形对象3&#xff09;主题设置4&#xff09;轴设置5&#xff09;图例设置6&#xff09;散点颜色7&#xff09;保存图片 前言 一、数据集 数据下载链接见文章顶部 处理前的数据…

LabVIEW图像采集处理项目中相机选择与应用

在LabVIEW图像采集处理项目中&#xff0c;选择合适的相机是确保项目成功的关键。本文将详细探讨相机选择时需要关注的参数、黑白相机与彩色相机的区别及其适用场合&#xff0c;帮助工程师和开发者做出明智的选择。 相机选择时需要关注的参数 1. 分辨率 定义&#xff1a;分辨率…

上心师傅的思路分享(三)--Nacos渗透

目录 1. 前言 2. Nacos 2.1 Nacos介绍 2.2 鹰图语法 2.3 fofa语法 2.3 漏洞列表 未授权API接口漏洞 3 环境搭建 3.1 方式一: 3.2 方式二: 3.3 访问方式 4. 工具监测 5. 漏洞复现 5.1 弱口令 5.2 未授权接口 5.3.1 用户信息 API 5.3.2 集群信息 API 5.3.3 配置…

Functional ALV系列 (10) - 将填充FieldCatalog封装成函数

在前面的博文中&#xff0c;已经讲了封装的思路和实现&#xff0c;主要是利用 cl_salv_data_descr>read_structdescr () 方法来实现。在这里&#xff0c;贴出代码方便大家参考。 编写获取内表组件的通用方法 form frm_get_fields using pt_data type any tablechanging…

微信小程序双层/多层 wx:for 循环嵌套,关于内外层的 index 和 item ;data-index 传递两个参数

微信小程序用 wx:for 循环可以快速将后端 js 的数组快速显示到前端&#xff1b; 那假如数组中嵌套数组&#xff1b;就存在内外层两层及以上的多层嵌套循环了。 那么如果两层的嵌套式循环 index 究竟是属于哪一层呢&#xff1f;item 又属于哪一个呢&#xff1f; <view><…

java之面向对象2笔记

1 接口(interface) 1.1 概述 接口&#xff08;Interface&#xff09;在计算机科学中&#xff0c;特别是在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;是一个重要的概念。它定义了一组方法的规范&#xff0c;但没有实现这些方法的具体代码。接口的主要目的是确保类…

介绍Linux

目录 1.什么是操作系统 2.现实生活中的操作系统 3.操作系统的发展史 4.操作系统的发展 Linux的不同版本以及应用领域 1.Linux内核及发行版介绍 <1>Linux内核版本 <2>Linux发行版本 2.应用领域 个⼈桌⾯领域的应⽤ 服务器领域 嵌⼊式领域 3.文件和目录 …

Pulsar 社区周报 | No.2024-06-07 | Apache Pulsar 新分支 3.3 版本发布

“ 各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar 社区周报更新啦&#xff01;这里将记录 Pulsar 社区每周的重要更新&#xff0c;每周发布。 ” 本期主题&#xff1a;Apache Pulsar 新分支 3.3 版本发布 Apache Pulsar 新分支 3.3 版本发布&#xff1a;Apache Pulsar 3.3.0[1…

2024屈原故里端午文化节开幕

6月7日&#xff0c;“中国端午诗意宜昌”2024屈原故里端午文化节在宜昌市秭归县屈原广场盛大开幕。相关嘉宾、屈氏后裔、华商侨商及外资企业代表、主流媒体代表和当地民众聚首屈原祠前&#xff0c;缅怀诗祖屈原&#xff0c;共襄端午盛典。 本届屈原故里端午文化节由湖北省人民政…

【SQLAlChemy】filter过滤条件如何使用?

filter 过滤条件 生成 mock 数据 # 创建 session 对象 session sessionmaker(bindengine)()# 本地生成mock数据 for i in range(6):# 生成随机名字, 长度为4到7个字符name .join(random.choice(string.ascii_letters) for _ in range(random.randint(4, 7)))# 生成随机年龄…

Lua搭建网站后台教程

本文讲解如何使用二进制发布包和FastWeb网站管理工具搭建站点 FastWeb网站管理工具 使用该工具可快速在Windows平台部署。支持官方或三方模块的自动安装、日志调试、版本更新等。 1、下载最新版本压缩包 2、解压到任意目录(建议英文) 3、运行 ①点击 [设置]->[安装] 部…

IO进程线程(八)线程(pthread_t)

文章目录 一、线程(LWP)概念二、线程相关函数&#xff08;一&#xff09;创建 pthread_create1. 定义2. 使用&#xff08;不传参&#xff09;3. 使用&#xff08;单个参数&#xff09;4. 使用&#xff08;多个参数&#xff09;5. 多线程执行的顺序6. 多线程内存空间 &#xff0…

BUUCTF---web---[GYCTF2020]Blacklist

1、来到题目连接页面 2、测试单引号和双引号&#xff0c;单引号报错&#xff0c;双引号没报错 1 1" 3、使用万能句式 4、使用堆叠注入测试&#xff0c;查看数据库名 1;show databases;# 5、查看表名 1;show tables;# 6、查看FlagHere中字段名 1;show columns from FlagH…

Python | Leetcode Python题解之第143题重排链表

题目&#xff1a; 题解&#xff1a; class Solution:def reorderList(self, head: ListNode) -> None:if not head:returnmid self.middleNode(head)l1 headl2 mid.nextmid.next Nonel2 self.reverseList(l2)self.mergeList(l1, l2)def middleNode(self, head: ListNo…

Webpack 从入门到精通-基础篇

一、webpack 简介 1.1 webpack 是什么 webpack 是一种前端资源构建工具&#xff0c;一个静态模块打包器(module bundler)。 在 webpack 看来, 前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理。 它将根据模块的依赖关系进行静态分析&#xff0c;打包生成对应的…

CA证书及PKI

文章目录 概述非对称加密User Case: 数据加密User Case: 签名验证潜在问题 CACA证书的组成CA签发证书流程CA验证签名流程CA吊销证书流程 PKI信任链证书链 概述 首先我们需要简单对证书有一个基本的概念&#xff0c;以几个问题进入了解 ❓ Question1: 什么是证书&#xff1f; 证…

数据可视化——pyecharts库绘图

目录 官方文档 使用说明&#xff1a; 点击基本图表 可以点击你想要的图表 安装&#xff1a; 一些例图&#xff1a; 柱状图&#xff1a; 效果&#xff1a; 折线图&#xff1a; 效果&#xff1a; 环形图&#xff1a; 效果&#xff1a; 南丁格尔图&#xff08;玫瑰图&am…

Mysql的InnoDB介绍

目录 show engines查看搜索殷勤&#xff0c;默认InnoDB。 Mysql为什么使用InnoDB作为默认存储引擎 InnoDB主要包括内存结构和磁盘结构 内存结构包含: 磁盘结构中包括: 为什么设计成内存结构和磁盘结构两部分 使用InnoDB存储引擎创建的表&#xff0c;对应的数据文件在哪里…

Android14之向build.prop添加属性(二百一十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…