动态规划Day07

70. 爬楼梯(进阶版)

卡码网:57. 爬楼梯(opens new window)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

输入描述:输入共一行,包含两个正整数,分别表示n, m

输出描述:输出一个整数,表示爬到楼顶的方法数。

输入示例:3 2

输出示例:3

提示:

当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。

此时你有三种方法可以爬到楼顶。

  • 1 阶 + 1 阶 + 1 阶段
  • 1 阶 + 2 阶
  • 2 阶 + 1 阶
看到题目的第一想法

        使用完全背包

        完全背包:同一个物品可以无限次使用

        背包 n   物品 0~m

        使用0~m 达到背包容量j 有多少种方法’

        这道题求的是顺序数,需要考虑背包和物品的顺序,应该是先背包后物品

看到代码随想录之后的想法

        动规五部曲,很快的写出解题思路

        1确定dp数组以及对应下标的含义

        使用0~m ,dp[j] 到达j层阶梯有多少种方法

        2确定递推公式

        dp[j]=dp[j-m]+dp[j]

        3dp数组初始化

        dp[0]=1 一切的起源

        4确定遍历顺序

        从前往后

        先背包后物品 因为需要考虑顺序

        5手动推导dp数组

        6打印dp数组

        

自己实现过程中遇到的困难

        求排列,我之前写成求组合了

        排列是要考虑顺序的,组合不需要考虑顺序

import java.util.*;
import java.lang.*;public class Main{public static void main (String[] args) {/*本题看起来是一道简单题目,稍稍进阶一下其实就是一个完全背包!如果我来面试的话,我就会先给候选人出一个 本题原题,看其表现,如果顺利写出来,进而在要求每次可以爬[1 - m]个台阶应该怎么写。顺便再考察一下两个for循环的嵌套顺序,为什么target放外面,nums放里面。这就能考察对背包问题本质的掌握程度,候选人是不是刷题背公式,一眼就看出来了。这么一连套下来,如果候选人都能答出来,相信任何一位面试官都是非常满意的。本题代码不长,题目也很普通,但稍稍一进阶就可以考察完全背包,而且题目进阶的内容在leetcode上并没有原题,一定程度上就可以排除掉刷题党了,简直是面试题目的绝佳选择!*///Dp数组的定义和每个下标的含义//完全背包,可以选择自己// weight[m]=[1,2,3...m]// j 代表到达j有多少种方法//dp[j] 爬到i层有多少中方法//确定递推公式// dp[j] += dp[j-nums[i]];//dp数组初始化// dp[0]=1//确定遍历顺序//从前往后,从nums[i]开始//举例推导dp数组Scanner sc = new Scanner(System.in);//n 为楼顶int n = sc.nextInt();// m 为一步最远的int m = sc.nextInt();int[] weight = new int[m+1];for(int i=1;i<=m;i++){weight[i] = i;}int dp[] = new int[n+1];dp[0]=1;// 这道题是求排列,所以我下面的顺序是错的,我这个顺序是求组合/*for(int i=1;i<=m;i++){for(int j=weight[i];j<=n;j++){dp[j]+=dp[j-weight[i]];}}*/for(int j=1;j<=n;j++){for(int i=1;i<=m;i++){if(j>=i) dp[j]+=dp[j-i];}}System.out.println(dp[n]);}
}

322. 零钱兑换(求最小值)

力扣题目链接(opens new window)

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

你可以认为每种硬币的数量是无限的。

示例 1:

  • 输入:coins = [1, 2, 5], amount = 11
  • 输出:3
  • 解释:11 = 5 + 5 + 1

示例 2:

  • 输入:coins = [2], amount = 3
  • 输出:-1

示例 3:

  • 输入:coins = [1], amount = 0
  • 输出:0

示例 4:

  • 输入:coins = [1], amount = 1
  • 输出:1

示例 5:

  • 输入:coins = [1], amount = 2
  • 输出:2

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 2^31 - 1
  • 0 <= amount <= 10^4
看到题目的第一想法

        可以凑成总金额所需的最少的硬币个数

        最小值应该怎么处理呢?没想到思路

看到代码随想录之后的想法

        动规五部曲,很快的写出解题思路

        1确定dp数组以及对应下标的含义

        使用0~m ,dp[j] 可以凑成总金额所需的最少的硬币个数

        2确定递推公式

        是否选中当前, 若选中则dp[j-coins[i]]+1

        dp[j]=Math.min(dp[j],dp[j-coins[i]]+1)

        3dp数组初始化

        dp[0]=0,其他都为Integer.MAX_VALUE

        4确定遍历顺序

        从前往后

        不需要考虑组合或排列,只是求最小值而已

        5手动推导dp数组

        6打印dp数组

        

自己实现过程中遇到的困难

        从dp[j]的定义来入手考虑递推公式,比如这道题dp[j]代表可以凑成总金额所需的最少的硬币个数,则递推公式为  ,要么选中当前物品 则为dp[j-coins[i]]+1 ,要么不选,则为dp[j](之前的值)

        求最小值,应该把其他元素都设为Integer.MAX_VALUE ,第一个元素为0

class Solution {public int coinChange(int[] coins, int amount) {//每次取最小值?//dp[i] 代表凑成总金额所需的硬币数目// 比如nums[0]=1 amount = 100 凑成1 需要dp[0]+1 or dp[1] 中的最小值 // 则凑成100 需要 dp[99]+1 or dp[100] 的最小值 ,dp[100-1] = dp[99]// dp数组的定义和下标的含义// 可以凑成j金额的最少硬币个数// 确定递推公式// 0~i凑成j金额的个数 每凑成一个+1// dp[j] = Math.min(dp[j-coins[i]]+1,dp[j])// dp数组初始化// dp[0] = 0,由于是凑成最小个数,则除开第一个外,其他的都是max// 确定遍历顺序// 举例推导dp数组int[] dp = new int[amount+1];dp[0]=0;for(int i=1;i<=amount;i++){dp[i] = Integer.MAX_VALUE;}for(int i=0;i<coins.length;i++){for(int j=coins[i];j<=amount;j++){//记录次数,每次加1// 只有j-coins[i] 不为最大值时,才有交换的必要,不然会把Integer.MAX_VALUE+1,造成溢出if(dp[j-coins[i]]!=Integer.MAX_VALUE)dp[j] = Math.min(dp[j],dp[j-coins[i]]+1);}}return dp[amount]==Integer.MAX_VALUE?-1:dp[amount];}
}

完全平方数

力扣题目链接(opens new window)

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

  • 输入:n = 12
  • 输出:3
  • 解释:12 = 4 + 4 + 4

示例 2:

  • 输入:n = 13
  • 输出:2
  • 解释:13 = 4 + 9

提示:

        看到题目的第一想法

        和上一题感觉差不多,也是求最小数量

        但物品为  各个数的平方,1 4 9 16.。。 要怎么来遍历?

        其实是用for循环来控制

        看到代码随想录之后的想法

        动规五部曲,很快的写出解题思路

        1确定dp数组以及对应下标的含义

        dp[j] 和为j的完全平方数的最小数量

        2确定递推公式

        是否选中当前, 若选中则dp[j-coins[i]]+1

        dp[j]=Math.min(dp[j],dp[j-i]+1)

        3dp数组初始化

        dp[0]=0,其他都为Integer.MAX_VALUE

        4确定遍历顺序

        从前往后

        不需要考虑组合或排列,只是求最小值而已

        5手动推导dp数组

        6打印dp数组

        

自己实现过程中遇到的困难

       按照for循环来确立物品的范围

        先背包后物品

        for(int i=1;i<=n;i++){

                //物品的平方要<=i

               for(int j=1;j*j<=i;j++){

                }

        }

        先物品后背包

        for(int i=1;i*i<=n;i++){

                //物品的平方要<=i

               for(int j=1;j<=m;j++){

                }

        }

        求最小值,应该把其他元素都设为Integer.MAX_VALUE ,第一个元素为0

  • class Solution {public int numSquares(int n) {//完全平方数和为背包容量j// 在完全平方数中选取能满足完全平方数和为背包容量j的最小个数// dp数组的定义和下标的含义// dp[j]为能满足容量j所需的完全平方数的最小个数// 确定递推公式// dp[j]=Math.min(dp[j],dp[j-某个平方]+1);// dp数组初始化// dp[0]=0,其他都为最大值// 确定遍历顺序// 可以重复使用,则从前往后// 举例推导dp数组// 平方为1 dp[0]=0,dp[1]=1;dp[2]=2;dp[3]=3;dp[4]=4;// 平方为4 dp[0]=0,dp[1]=1;dp[2]=2;dp[3]=3;dp[4]=1;int[] dp  = new int[n+1];for(int i=0;i<=n;i++){dp[i]=Integer.MAX_VALUE;}dp[0] = 0;for(int i=1;i*i<=n;i++){for(int j=i*i;j<=n;j++){dp[j] = Math.min(dp[j],dp[j-i*i]+1);}}return dp[n];}
    }

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

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

相关文章

【C初阶——内存函数】鹏哥C语言系列文章,基本语法知识全面讲解

本文由睡觉待开机原创&#xff0c;转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&#xff01; 这里写目录标题 1.memcpy使用和模拟实现2.memmove的使用和模拟实现3.memset函数的使用4.memcpy函数的使用 1.m…

linux安装MySQL5.7(安装、开机自启、定时备份)

一、安装步骤 我喜欢安装在/usr/local/mysql目录下 #切换目录 cd /usr/local/ #下载文件 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz #解压文件 tar -zxvf mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz -C /usr/local …

ERP和MES对接的几种接口方式

在数字化工厂的规划建设中&#xff0c;信息化系统的集成&#xff0c;既是重点&#xff0c;但同时也是难点。ERP和MES对接时&#xff0c;ERP主要负责下达生产计划&#xff0c;MES是执行生产计划&#xff0c;二套系统在数据交互时&#xff0c;需要确保基础数据的一致性&#xff0…

SpringBoot源码分析

一&#xff1a;简介 由Pivotal团队提供的全新框架其设计目的是用来简化新Spring应用的初始搭建以及开发过程使用了特定的方式来进行配置快速应用开发领域 二&#xff1a;运行原理以及特点 运行原理&#xff1a; SpringBoot为我们做的自动配置&#xff0c;确实方便快捷&#…

傅里叶级数到傅里叶变换

傅里叶级数 定义形式 f ( t ) 1 2 α 0 ∑ n 1 ∞ [ α n c o s ( n ω t ) β n s i n ( n ω t ) ] f(t)\frac{1}{2}\alpha_0 \sum_{n1}^{\infty}[\alpha_ncos(n\omega t)\beta_n sin(n \omega t)] f(t)21​α0​n1∑∞​[αn​cos(nωt)βn​sin(nωt)] 其中 ω 2 π…

STC8H8K蓝牙智能巡线小车——2. 点亮左右转弯灯与危险报警灯

任务调用示例 RTX 51 TNY 可做多任务调度&#xff0c;API较为简单。 /* 接口API */// 创建任务 extern unsigned char os_create_task (unsigned char task_id); // 结束任务 extern unsigned char os_delete_task (unsigned char task_id);// 等待 extern unsig…

算法训练营Day45(完全背包)

70. 爬楼梯 &#xff08;进阶&#xff09; 题目页面 (kamacoder.com) 完全背包的排列问题 import java.util.Scanner; class Main{public static void main(String [] args){Scanner sc new Scanner(System.in);int m,n;while(sc.hasNextInt()){n sc.nextInt();m sc.nextInt…

C++ 类构造函数 析构函数

类的构造函数 类的构造函数是类的一种特殊的成员函数&#xff0c;它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的&#xff0c;并且不会返回任何类型&#xff0c;也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地…

C#学习教程

目录 版本:VS2022 一、C#简介 程序定义: 程序的的作用:

阿里云如何完全卸载阿里云盾(安骑士)并屏蔽阿里云盾IP

事情说明 为什么买了服务器之后明明什么都没有配置&#xff0c;阿里云却会给你推送服务器的危险消息&#xff1f;如何解决这个问题&#xff1f; 原因 阿里云盾&#xff08;AliYunDun&#xff09;&#xff0c;又名阿里云安骑士&#xff0c;是阿里云自带的云监控软件&#xff…

RTKlib操作手册--使用样例数据演示

简介 RTKLIB&#xff08;Real-Time Kinematic Library&#xff09;是一款开源的实时差分全球导航卫星系统&#xff08;GNSS&#xff09;软件库。它旨在提供高精度的位置解算&#xff0c;特别是在实时应用中&#xff0c;如精密农业、测绘、无人机导航等领域。 RTKLIB支持多种G…

Python 对象属性和类属性

本篇为Python 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。 目录 对象属性与类属性 类属性 对象属性 属性优先级 动态对象属性只针对当前对象 动态添加属性和方法 动态添加属性 动态添加方法 引入方法参数处理库 添加方法 限制动态添加属性…

目标检测数据集 - 人脸检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;行人检测数据集&#xff0c;真实场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如校园行人、街景行人、道路行人、遮挡行人、严重遮挡行人数据&#xff1b;适用实际项目应用&#xff1a;公共场所监控场景下行人检测项目&#xff0c;以及作为…

如何写好年终总结?

前面有读者留言问年终总结要怎么写&#xff0c;我一听你要聊这个我可不困了&#xff0c;这活我熟啊&#xff0c;谁不知道我厂是 PPT 之王。先来一套打法闭环方法论&#xff0c;再来一套赋能抓手组合拳&#xff0c;如此这般&#xff0c;便可笑傲于江湖。 玩笑归玩笑&#xff0c…

常用界面设计组件 —— 字符串与输入输出组件(QT)

2.2 字符串与输入输出组件2.2.1 字符串与数值之间的转换2.2.2 QString的常用功能 2.2 字符串与输入输出组件 2.2.1 字符串与数值之间的转换 界面设计时使用最多的组件恐怕就是QLabel和 QLineEdit了&#xff0c;QLabel用于显示字符串&#xff0c;QLineEdit用于 显示和输入字符…

MetaGPT-打卡day01

MetaGPT是一个基于大型语言模型&#xff08;LLMs&#xff09;的多智能体协作框架。它利用SOP&#xff08;Standard Operating Procedures&#xff0c;标准作业程序&#xff09;来协调基于大语言模型的多智能体系统&#xff0c;从而实现元编程技术。该框架使用智能体模拟了一个虚…

程序员必备的面试技巧:从忍者到铁金刚的华丽转变

在科技世界的江湖中&#xff0c;程序员作为武林高手&#xff0c;面试是他们闯荡江湖的一场重要考验。在这场考验中&#xff0c;我们需要像忍者一样灵活&#xff0c;像侦探一样聪明&#xff0c;还要像无敌铁金刚一样坚定。本文将带你探索程序员必备的面试技巧&#xff0c;助你书…

ioDraw在线图表工具 - 轻松制作专业图表,只需3步!

还在花大量时间手动画图表&#xff1f;还在为图表样式而烦恼&#xff1f;ioDraw为你提供一站式解决方案&#xff01;ioDraw在线图表工具实现了AI自动生成图表&#xff0c;让你轻松制作专业图表&#xff0c;只需3步&#xff01; 1. 录入数据 只需将你的数据告诉ioDraw AI助手&…

最新版Navicat的安装与激活

最新版Navicat的安装与激活 图文教程链接&#xff1a;图文教程视频教程链接&#xff1a;视频教程此教程适用于Navicat161之后版本的激活&#xff0c;Navicat161之后的版本暂时无法通过注册机的方式进行激活&#xff0c;如需通过注册机激活Navicat161及之前的版本&#xff0c;请…

[Docker] Dockerfile

文章目录 什么是 Dockerfile&#xff1f;使用 Dockerfile 定制镜像开始构建镜像上下文路径 指令详解COPYADDCMDENTRYPOINTENVARGVOLUMEEXPOSEWORKDIRUSERHEALTHCHECKONBUILD 什么是 Dockerfile&#xff1f; Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了…