【Day50】代码随想录之动态规划完全背包_70. 爬楼梯进阶_322. 零钱兑换 _279.完全平方数

本文主要是介绍【Day50】代码随想录之动态规划完全背包_70. 爬楼梯进阶_322. 零钱兑换 _279.完全平方数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 动态规划理论基础
        • 动规五部曲:
        • 出现结果不正确:
      • 70. 爬楼梯进阶
      • 322. 零钱兑换
      • 279.完全平方数

动态规划理论基础

动规五部曲:
  1. 确定dp数组 下标及dp[i] 的含义。
  2. 递推公式:比如斐波那契数列 dp[i] = dp[i-1] + dp[i-2]。
  3. 初始化dp数组。
  4. 确定遍历顺序:从前到后or其他。
  5. 打印。
出现结果不正确:
  1. 打印dp日志和自己想的一样:递推公式、初始化或者遍历顺序出错。
  2. 打印dp日志和自己想的不一样:代码实现细节出现问题。

70. 爬楼梯进阶

参考文档:代码随想录

分析:
根据题目描述是完全背包的排列问题,遍历顺序为先背包再物品。
dp五部曲:

  1. dp[i]含义:爬到j楼的方法个数。
  2. 递推公式:dp[i] += dp[i-j];
  3. 初始化:dp[0] = 1, 其余位置为0。
  4. 遍历顺序:先背包再物品。

代码:

#include<iostream>
#include<stdio.h>
#include<vector>using namespace std;int main(){int m = 0, n = 0;scanf("%d%d",&n, &m);vector<int> dp(n+1, 0);dp[0] = 1;for(int i = 1; i <= n; i++){//先背包for(int j = 1; j <= m; j++){//再物品if(i >= j) dp[i] += dp[i-j];}}printf("%d", dp[n]);return 0;
}

322. 零钱兑换

参考文档:代码随想录

分析:
dp公式:dp[j] = min(dp[j], dp[j-coins[i]]+1)。
因为题目求的是最少的硬币个数,所以排列组合都可以,即物品和背包的遍历顺序均可。
初始化需要注意dp[0]是0,其余的为了不影响之后的取最小值,定义为32位数的最大值INT_MAX。

代码:

class Solution {
public:int coinChange(vector<int>& coins, int amount) {//dp[j]:amount=j需要的最少硬币个数//dp[j] = min(dp[j], dp[j-coins[i]]+1);//dp[0] = 0, 其他初始化INT_MAXvector<double> dp(amount+1, INT_MAX);dp[0] = 0;for(int i = 0; i < coins.size(); i++){for(int j = coins[i]; j <= amount; j++){dp[j] = min(dp[j], dp[j-coins[i]]+1);}}if(dp[amount] == INT_MAX) return -1;return dp[amount];}
};

279.完全平方数

参考文档:代码随想录

分析:
dp公式改变:dp[j] = min(dp[j], dp[j-i*i]+1);

代码:

class Solution {
public:int numSquares(int n) {//dp[j]: 和为j的完全平方数的最少数量//dp[j] = min(dp[j], dp[j-i*i]+1);//初始化:dp[0] = 0,其余初始化是INT_MAXint nums = n/2;if(n == 1) nums = 1;vector<double> dp(n+1, INT_MAX);dp[0] = 0;for(int i = 1; i <= nums; i++){for(int j = i*i; j <= n; j++){dp[j] = min(dp[j], dp[j-i*i]+1);}}return dp[n];}
};

这篇关于【Day50】代码随想录之动态规划完全背包_70. 爬楼梯进阶_322. 零钱兑换 _279.完全平方数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与