【代码随想录】【算法训练营】【第43天】 [518]零钱兑换II [377]组合总和IV [卡码57]爬楼梯

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。
部分题目来自卡码网。

day 43,极其困难的周三~

题目详情

[518] 零钱兑换II

题目描述

518 零钱兑换II
518 零钱兑换II

解题思路

前提:假设每一种面额的硬币有无限个,求组合数
思路:完全背包问题,求组合数,dp[i][j]: 在[0, i]中取硬币凑成总金额为j的组合数,dp[i][j] = dp[i-1][j] + dp[i][j-coins[i]],使用一维数组即为dp[j] = dp[j] + dp[j-coins[i]]。
重点:组合数的遍历顺序:先遍历物品,后遍历背包。

代码实现

C语言
dp[i][j]
// 完全背包问题, 求组合数
// dp[i][j]: 在[0, i]中取硬币凑成总金额为j的组合数
// dp[i][j] = dp[i-1][j] + dp[i][j-coins[i]]int change(int amount, int* coins, int coinsSize) {int dp[coinsSize][amount + 1];// dp数组初始化dp[0][0] = 1;for (int j = 1; j <= amount; j++) {if (j < coins[0]) {dp[0][j] = 0;} else {dp[0][j] = dp[0][j - coins[0]];}}// 组合数:先遍历硬币,再遍历总金额for (int i = 1; i < coinsSize; i++) {for (int j = 0; j <= amount; j++) {dp[i][j] = dp[i - 1][j];if (j >= coins[i]) {dp[i][j] += dp[i][j - coins[i]];}}}return dp[coinsSize - 1][amount];
}
dp[j]
// 完全背包问题, 求组合数
// 压缩dp[i][j]为dp[j]: 在[0, i]中取硬币凑成总金额为j的组合数
// dp[j] = dp[j] + dp[j-coins[i]]int change(int amount, int* coins, int coinsSize) {int dp[amount + 1];// dp数组初始化dp[0] = 1;for (int j = 1; j <= amount; j++) {dp[j] = 0;}// 组合数:先遍历硬币,再遍历总金额for (int i = 0; i < coinsSize; i++) {for (int j = coins[i]; j <= amount; j++) {if (j >= coins[i]) {dp[j] += dp[j - coins[i]];}}}return dp[amount];
}

[377] 组合总和IV

题目描述

377 组合总和IV
377 组合总和IV

解题思路

前提:数组元素不同,顺序不同的序列被视作不同的组合。
思路:完全背包问题,求排列数,dp[i][j]: 从数组nums的前i个位置中取元素,和为j的组合数,dp[i][j] = dp[i-1][j] + dp[numsSize][j-nums[i]];压缩一维数组为dp[j] = dp[j] + dp[j-nums[i]]
重点:遍历顺序,二维数组的推导公式,以及初始化; dp[numsSize][j - nums[i]]可以理解为最后一位为nums[i]的排列数。

代码实现

C语言
dp[i][j]

dp[i][j]: 从数组nums的前i个位置中取元素,和为j的组合数,所以dp数组大小为int dp[numsSize + 1][target + 1],返回为dp[numsSize][target],dp[i][j] = dp[i-1][j] + dp[numsSize][j-nums[i]]

// 完全背包, 排列个数
// dp[i][j]: 从数组nums的前i个位置中取元素,和为j的组合数
// dp[i][j] = dp[i-1][j] + dp[numsSize][j-nums[i]]int combinationSum4(int* nums, int numsSize, int target) {int dp[numsSize + 1][target + 1];// dp数组初始化for (int i = 0; i <= numsSize; i++) {// 首列dp[i][0] = 1;}for (int j = 1; j <= target; j++) {// 首行dp[0][j] = 0;}// 遍历, 排列数, 先遍历目标和target, 后遍历数组numsfor (int j = 0; j <= target; j++) {for (int i = 1; i <= numsSize; i++) {dp[i][j] = dp[i - 1][j];if ((j >= nums[i - 1]) && (dp[i - 1][j] < INT_MAX - dp[numsSize][j - nums[i - 1]])) {dp[i][j] += dp[numsSize][j - nums[i - 1]];}}}return dp[numsSize][target];
}

dp[i][j]: 从数组nums的前i中取元素,和为j的组合数,所以dp数组大小为int dp[numsSize][target + 1],返回为dp[numsSize - 1][target],
dp[i][j] = dp[i-1][j] + dp[numsSize - 1][j-nums[i]]

// 完全背包, 排列个数
// dp[i][j]: 从数组nums的前i中取元素,和为j的组合数
// dp[i][j] = dp[i-1][j] + dp[numsSize - 1][j-nums[i]]
// dp[numsSize - 1][j - nums[i]]可以理解为最后一位为nums[i]的排列数int combinationSum4(int* nums, int numsSize, int target) {int dp[numsSize][target + 1];// dp数组初始化dp[0][0] = 1;for (int i = 0; i < numsSize; i++) {dp[i][0] = 1;}// 遍历, 排列数, 先遍历目标和target, 后遍历数组numsfor (int j = 1; j <= target; j++) {for (int i = 0; i < numsSize; i++) {if (i == 0) {dp[i][j] = 0;} else {dp[i][j] = dp[i - 1][j];}if ((j >= nums[i]) && (dp[i][j] < INT_MAX - dp[numsSize - 1][j - nums[i]])) {dp[i][j] += dp[numsSize - 1][j - nums[i]];}}}return dp[numsSize - 1][target];
}
dp[j]
// 完全背包, 排列个数
// dp[j]: 从数组nums的前i中取元素,和为j的排列数
// dp[j] = dp[j] + dp[j-nums[i]]int combinationSum4(int* nums, int numsSize, int target) {int dp[target + 1];// dp数组初始化dp[0] = 1;for (int j = 1; j <= target; j++) {dp[j] = 0;}// 遍历, 排列数, 先遍历目标和target, 后遍历数组numsfor (int j = 0; j <= target; j++) {for (int i = 0; i < numsSize; i++) {if ((j >= nums[i]) && (dp[j] < INT_MAX - dp[j - nums[i]])) {dp[j] += dp[j - nums[i]];}}}return dp[target];
}

[卡码57] 爬楼梯

题目描述

卡码57 爬楼梯
卡码57 爬楼梯

解题思路

前提:求到达楼顶的不同方法的数量
思路:完全背包,求排列数,dp[i][j]: 至多每次i个台阶,可以到达j阶高度的排列方法数, dp[i][j] = dp[i-1][j] + dp[m][j-i];压缩一维数组为dp[[j] = dp[j] + dp[j-i]
重点:遍历顺序,二维数组的推导公式,以及初始化。

代码实现

C语言
dp[i][j]
#include <stdio.h>
#include <stdlib.h>// 完全背包,求排列数
// dp[i][j]: 至多每次i个台阶,可以到达j阶高度的排列方法数
// dp[i][j] = dp[i-1][j] + dp[m][j-i]int clamb(int n, int m)
{int dp[m + 1][n + 1];// 初始化dp数组for (int i = 0; i <= m; i++) {// 首行dp[i][0] = 1;}for (int j = 1; j <= n; j++) {// 首列dp[0][j] = 0;}// 排列数,先遍历高度,再遍历每次台阶数for (int j = 1; j <= n; j++) {for (int i = 1; i <= m; i++) {dp[i][j] = dp[i - 1][j];if (j >= i) {dp[i][j] += dp[m][j - i];}//printf("%d %d %d\n", i, j, dp[i][j]);}}return dp[m][n];
}int main()
{int n;int m;scanf("%d %d",&n, &m);int ans = clamb(n, m);printf("%d", ans);return 0;
}
dp[j]
#include <stdio.h>
#include <stdlib.h>// 完全背包,求排列数
// dp[j]: 至多每次i个台阶,可以到达j阶高度的排列方法数
// dp[[j] = dp[j] + dp[j-i]int clamb(int n, int m)
{int dp[n + 1];// 初始化dp数组dp[0] = 1;for (int j = 1; j <= n; j++) {dp[j] = 0;}// 排列数,先遍历高度,再遍历每次台阶数for (int j = 1; j <= n; j++) {for (int i = 1; i <= m; i++) {if (j >= i) {dp[j] += dp[j - i];}//printf("%d %d %d\n", i, j, dp[j]);}}return dp[n];
}int main()
{int n;int m;scanf("%d %d",&n, &m);int ans = clamb(n, m);printf("%d", ans);return 0;
}

今日收获

  1. 完全背包问题:组合数(先遍历物品,后遍历背包),排列数(先遍历背包,后遍历物品);虽然一维dp数组的递推公式都是一样的,但是二维dp数组的递推公式有较大的差别,初始化也不太一样,排列数的 dp[i][j] = dp[i-1][j] + dp[numsSize - 1][j-nums[i]] 明显更难以理解一些。

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

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

相关文章

Java23种设计模式(一)

前言 这2个月来&#xff0c;重新出发&#xff0c;从java开发需要的数据库、查询日志工具、开发工具等的安装、环境配置&#xff0c;再到后面的基础学习、数据库学习、扩展学习&#xff08;maven、mq、设计模式、spring 系列等等&#xff09;&#xff0c;边学边记录&#xff0c…

QT串口调试助手V2.0(源码全开源)--上位机+多通道波形显示+数据保存(优化波形显示控件)

首先关于Qt的安装和基本配置这里就不做重复说明了&#xff0c;注&#xff1a;本文在Qt5.14基础上完成 完整的项目开源仓库链接在文章末尾 图形控件——qcustomplot QCustomPlot是一个基于Qt框架的开源绘图库&#xff0c;用于创建高质量的二维图表和数据可视化。 QCustomPlot…

【王树森】深度强化学习(DRL)学习笔记

目录 第一部分&#xff1a;基础知识1.机器学习基础2.蒙特卡洛估计3.强化学习基础知识3.1 马尔科夫决策过程马尔可夫决策过程&#xff08;Markov decision process&#xff0c;MDP&#xff09;智能体环境状态状态空间动作动作空间奖励状态转移状态转移概率 3.2 策略策略定义 3.3…

基于Go开发的开源远程桌面分享工具ScreeGo编译使用

1. 克隆源码 : git clone --recursive https://github.com/screego/server.git 2. 使用GoLand打开工程 3.进入Server目录运行go mod downalod 下载依赖 4.创建配置文件screego.config.development.local内容如下&#xff1a; SCREEGO_EXTERNAL_IP你的公网IP 5. 编译并运行服务…

工业互联网的独特UI风格

工业互联网的独特UI风格

工业 web4.0,UI 风格令人赞叹

工业 web4.0&#xff0c;UI 风格令人赞叹

自学网络安全 or Web安全,一般人我还是劝你算了吧

由于我之前写了不少网络安全技术相关的文章&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人私信问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f; 要学哪些东西&#xff1f; 有哪些方向&#xff1f; 怎么选&#xff1f;…

《OKR工作法》读书笔记

花了两个晚上的时间看完了《OKR工作法》这本书&#xff0c;谈不上有什么感想&#xff0c;因为工作后&#xff0c;其实就一直在用这种方法&#xff0c;所谓当局者迷嘛&#xff0c;习以为常也就谈不上多少新的启发。所以&#xff0c;这篇文章纯粹是一篇读书笔记&#xff0c;把我认…

【STM32】矩阵计算器

【STM32】矩阵计算器 资料链接请在文章末尾获取~ 1.说明 使用元器件&#xff1a;stm32f103c8t6最小系统板x1&#xff0c;0.96寸OLED显示屏四角x1&#xff0c;4x4矩阵按键x1; 参考&#xff1a;正点原子有关4脚OLED驱动float型数据的驱动文件&#xff0c;CSDN有关矩阵横向扫描…

数据模型——饮食记录

数据模型——饮食记录 本次实验完成饮食记录的数据模型&#xff0c;如下图所示 该饮食记录模型与上次的记录项数据模式定义处理方式相同&#xff0c;我们首先分析其数据结构&#xff0c;我们发现首先有早餐、午餐、晚餐等记录类型数据模型&#xff0c;其包括了id、类型名称、类…

AI人工智能产品经理,就该这么学!

前言 想入行AI人工智能产品经理&#xff0c;该如何学习呢&#xff1f; 随时AI的兴起&#xff0c;AI产品经理开始爆火&#xff0c;很多功能性产品经理想转行做AI产品经理。转行的原因&#xff0c;这个仁者见仁智者见智。唯一的共同点就是&#xff0c;大家都看好AI行业的发展前景…

Java 诊断神器 Arthas使用笔记

Arthas 是一款开源在线 Java 诊断工具&#xff0c;采用命令行交互模式&#xff0c;支持 web 端在线诊断&#xff0c;同时提供丰富的 Tab 自动补全功能&#xff0c;进一步方便进行问题的定位和诊断。得益于 Arthas 强大且丰富的功能。 1.JDK原生定位工具 平时开发中会用到JDK中…

edge如何找包已经安装的插件。

我的目录&#xff1a;C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Extensions 如图&#xff1a; 如何我要打包如下图 注意iD的名字 多次操作选择到ID的目录&#xff0c;再向下。 如上图之后。打包。 显示成功 并提供地址。 找到相应地址&#x…

监控员工上网软件有哪些|4款好用的员工上网行为管理软件推荐

在当今数字化办公环境中&#xff0c;确保网络安全、提升工作效率、以及规范员工上网行为成为企业管理的重要组成部分。 为此&#xff0c;一套高效的员工上网行为管理软件显得尤为关键。 本文将为您推荐五款市场上广受好评的员工上网行为管理软件&#xff0c;帮助您有效监控与管…

linux离线安装chrony服务校准时间

基础环境 Linux forlinx 5.10.35 #53 SMP PREEMPT Thu Mar 30 01:04:19 CST 2023 aarch64 aarch64 aarch64 GNU/Linux chrony源码包 下载地址&#xff1a;https://download.tuxfamily.org/chrony/ 以chrony-4.5.tar.gz举例说明 详细步骤 1.解压chrony tar zxvf chrony-4.…

【Spine学习14】之 裁剪

1、新建裁剪 2、在页面中随便点几下 圈出对应位置 3、点编辑裁剪 或者按空格键 退出编辑模式&#xff0c; 页面就只剩下对应区域&#xff0c;这个区域可以任意拖动 放大缩小显示。 tips&#xff1a; 如果手动选择区域描绘不准确&#xff0c;可以启用对应图片的网格 然后复制…

无监督学习:从理论到实践的全面指南

本文深入讲解了无监督学习中的K-means、层次聚类、密度聚类、PCA、t-SNE和自编码器算法&#xff0c;涵盖其原理、数学基础、实现步骤及应用实例&#xff0c;并提供了详细的代码示例。 关注作者&#xff0c;复旦AI博士&#xff0c;分享AI领域全维度知识与研究。拥有10年AI领域研…

外链应该怎么做才有效?

做有效的外链&#xff0c;关键在于策略和执行&#xff0c;高质量的独立站外链就是一个不错的选择&#xff0c;确保是dofollow&#xff0c;每一条都被谷歌收录&#xff0c;并保证长期留存&#xff0c;至少一年以上&#xff0c;这种外链就是能发挥最大效果的外链&#xff0c;名为…

全新防关联技术出炉:亚马逊测评环境优化,下单成功率大提升

在竞争激烈的测评行业中&#xff0c;构建一个稳定且高效的环境系统成为了制胜的关键。然而&#xff0c;市场上现有的环境方案如虚拟机、模拟机、GCS、云手机、VPS等不仅成本高昂&#xff0c;而且面临着在风控严格的平台上如亚马逊难以逃脱检测的挑战&#xff0c;进而影响了测评…

Memory use report提示信息

Memory use report: Heap dump has been created at C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2021.3\tmp\hprof-temp\heapDump-idea-1718785956302.hprof. It will be analyzed next time you start IntelliJ IDEA.Memory use report提示信息 Memory use…