代码随想录算法训练营第四十五天|70.爬楼梯、322.零钱兑换、279.完全平方数

server/2024/9/24 13:32:44/

代码随想录算法训练营第四十五天|70.爬楼梯、322.零钱兑换、279.完全平方数

70.爬楼梯

题目描述

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

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

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

输入描述

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

输出描述

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

输入示例
3 2
输出示例
3

题解:完全背包的排列问题

  • dp[i] :到达 台阶 i 有dp[i]种方法
  • 递推公式 :dp[j]+=dp[i-j]
  • 初始化:dp[0]=1
  • 遍历顺序:target放外循环,nums放内循环,因为是排列问题,所以先遍历背包,后遍历物品
  • 打印dp数组

代码

java">import java.util.Scanner;public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);int n=sc.nextInt();int m=sc.nextInt();int [] dp=new int[n+1];dp[0]=1;//排列问题都是先背包后物品for(int j=1;j<=n;j++){  //背包for(int i=1;i<=m;i++){  //物品if(j-i>=0)dp[j]+=dp[j-i];}}System.out.println(dp[n]);}
}

322.零钱兑换

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1

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

示例 1:

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

题解:因为可取硬币数是无限的,所以是一个完全背包问题。

  • dp[j] : 组成 j 最少需要 dp[j] 个硬币
  • 递推公式 : dp[j] = Math.max(dp[j],dp[j-weight[i]]+valeu[i])
  • 初始化:dp[0]=1
  • 遍历顺序:普通完全背包顺序,两层for都是从前到后
  • 打印dp数组

需要注意的是:为什么dp数组初始化为最大值?因为求的是最小值,根据题意,dp[0]=0,所以非零下标也初始化为0的话,最小值会被0全部覆盖,所以要初始化为最大值。

代码

java">class Solution {public int coinChange(int[] coins, int amount) {int max=Integer.MAX_VALUE;int dp[] =new int[amount+1];for(int j=1;j<=amount;j++){dp[j]=max;}dp[0]=0;for(int i=0;i<coins.length;i++){ //物品for(int j=coins[i];j<=amount;j++){  //背包if(dp[j-coins[i]]!=max){dp[j]=Math.min(dp[j],dp[j-coins[i]]+1);}}}return dp[amount]==max?-1:dp[amount];}
}

279.完全平方数

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

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,14916 都是完全平方数,而 311 不是。

示例 1:

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

题解:完全背包问题。

  • dp[j]: 和为 j 的完全平方数的最少个数是dp[j]
  • 递推公式: dp[j]=Math.min(dp[j-i*i],dp[j])
  • 初始化:dp[0]=0,求最小值,所以非零下标初始化为最大值
  • 遍历顺序:两层for 都从前向后
  • 打印dp数组

代码

java">class Solution {public int numSquares(int n) {int [] dp=new int[n+1];int max=Integer.MAX_VALUE;for(int i=1;i<n+1;i++){dp[i]=max;}dp[0]=0;for(int i=1;i*i<=n;i++){for(int j=i*i;j<=n;j++){if(j>=i*i)dp[j]=Math.min(dp[j],dp[j-i*i]+1);}}return dp[n];}
}

http://www.ppmy.cn/server/5304.html

相关文章

Java compare compareTo方法区别详解

compareTo compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法&#xff0c;当需要对某个类的对象进行排序时&#xff0c;该类需要实现Comparable<T>接口的&#xff0c;必须重写public int compareTo(T o)方法。 它强行将实现它的每一个类的对象进行整…

N-149基于微信小程序网上商城系统

开发工具&#xff1a;IDEA、微信小程序 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;vue、uniapp 服务端技术&#xff1a;springbootmybatisredis 本系统分微信小程序和管理后台两部分&a…

密码学 | 椭圆曲线密码学 ECC 入门(四)

目录 正文 1 曲线方程 2 点的运算 3 求解过程 4 补充&#xff1a;有限域 ⚠️ 知乎&#xff1a;【密码专栏】动手计算双线性对&#xff08;中&#xff09; - 知乎 ⚠️ 写在前面&#xff1a;本文属搬运博客&#xff0c;自己留着学习。注意&#xff0c;这篇博客与前三…

● State Schema Evolution的平滑迁移策略

State Schema Evolution指的是在分布式系统或数据库中&#xff0c;随着业务需求的发展和变化&#xff0c;需要对存储的状态&#xff08;如数据库表结构、数据模型等&#xff09;进行升级或调整的过程。平滑迁移策略的目标是在不影响系统正常运行、尽量减少服务中断时间的前提下…

Rust---#[derive(Debug)]

在 Rust 中,#[derive(Debug)] 宏用于自动为结构体或枚举实现 Debug trait。Debug trait 允许一个类型的实例被格式化为字符串,通常用于调试输出。以下是 #[derive(Debug)] 通常的使用方式: 目录 定义结构体或枚举使用 println! 宏打印调试信息在自定义 Debug 实现中使用定义…

【LeetCode热题100】【动态规划】最长递增子序列

题目链接&#xff1a;300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 让dp[i]是以nums[i]为结尾的子序列的最长递增长度&#xff0c;遍历nums[i]之前的元素&#xff0c;如果有比nums[i]小的&#xff0c;说明递增子序列可以延申 class Solution { public:int le…

第17天:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

第十七天 本课意义 1.CMS识别到后期漏洞利用和代码审计 2.开发框架识别到后期漏洞利用和代码审计 3.开发组件识别到后期漏洞利用和代码审计 一、CMS指纹识别-不出网程序识别 1.概念 CMS指纹识别一般能识别到的都是以PHP语言开发的网页为主&#xff0c;其他语言开发的网页识…

Mac电脑上有什么好玩的格斗游戏 《真人快打1》可以在苹果电脑上玩吗

你是不是喜欢玩格斗游戏&#xff1f;你是不是想在你的Mac电脑上体验一些刺激和激烈的对战&#xff1f;在这篇文章中&#xff0c;我们将介绍Mac电脑上有什么好玩的格斗游戏&#xff0c;以及《真人快打1》可以在苹果电脑上玩吗。 一、Mac电脑上有什么好玩的格斗游戏 格斗游戏是…