【蓝桥杯速成】| 17.完全背包(一维easy版)

news2025/4/6 20:28:35

题目一:爬楼梯

问题描述

57. 爬楼梯(第八期模拟笔试)

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

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

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

输入描述

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

输出描述

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

输入示例

3 2

输出示例

3

提示信息

数据范围:
1 <= m < n <= 32;

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

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

  1. 1 阶 + 1 阶 + 1 阶段
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

解题步骤

昨天的题目我们已经用二维数组实现了完全背包在排列问题和组合问题上的应用

那么今天我们用一维数组来简化一下方法,使代码更短,思路更清晰

首先审题!(不然就会跟我一样一直AC不了最后发现是n,m搞反了)

要先输入两个整数n,m

一定要看清楚n是总台阶数,m是最大步数

也就是说我们每次可以在1~m中选取,最后总和为n

用完全背包套一下定义就是

现在背包最大容量为n,我们有1~m号物品,价值,重量就是对应索引

所以这一题不需要额外的数组来存储物品价值,重量,一切和 i 表示的一致

动规五部曲

1.确定dp数组下标及含义

i 表示可以从1~i 步中选择

j表示台阶数

dp[i][j]表示每次走1~i阶台阶,到达j的方法有dp[i][j]种

以上是二维数组的定义,那么我们只要去掉i这个维度,就可以变成一维

因为每次加入一种步伐选择,我们的方案数都是在原来的基础上增加的

所以可以使用dp[ j ]来代表台阶为 j 时可选方案有dp[ j ]种

2.初始化

一维dp数组的初始化就很简单了,我们只要让dp[0]=1即可

表示0阶台阶有一种方法,就是不走

3.遍历顺序

从示例来看,当 m = 2,n = 3 时,有三种方法可以爬到楼顶

  1. 1 阶 + 1 阶 + 1 阶段
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

也就是说[1,2],[2,1]是不同组合,我们强调顺序

所以这题属于排列问题

需要先遍历背包容量(也就是台阶数),再遍历物品种类(也就是步伐)

 for(int j=1;j<=n;j++){//在初始化后一个状态开始生成

        for(int i=1;i<=m;i++){//步伐数属于[1,m]闭区间别忘记取等

 4.递推公式

当加入步伐数i时,依旧有两种选择,使用或者不使用

不使用那就是不改变当前状态对一维数组也就不需要更新

使用的话背包容量就要空出相应部分,前提是背包容量足够

if( j >= i ){

        dp[ j ]+=dp[ j-i ];

}

 5.发现错误即时打印dp检查一下!

最后只需要输出dp[n]即可,完整代码如下!

code

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,m;
    cin>>n>>m;
    vector<int> dp(n+1,0);
    dp[0]=1;
    for(int j=1;j<=n;j++){
        for(int i=1;i<=m;i++){
            if(j>=i)
            dp[j]+=dp[j-i];
        }
    }
    cout<<dp[n];
    return 0;
}

题目二:零钱兑换

问题描述

322. 零钱兑换 - 力扣(LeetCode)

给你一个整数数组 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

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104

解题步骤

我们已经做过零钱兑换②

那么这个初代有什么不一样呢?

读题可以发现,这里求的是最少的硬币个数

之前的题目里我们有求背包最大价值,方案数等等

但这个求方案里的元素个数,并且是最小值,还是第一次见

所以递推公式我们需要重新考虑一下,其它小细节也不能放过

例行公事!(这里使用一维数组喽!)

1.确认dp数组下标及含义

dp[j]表示背包容量(硬币总额)为j时,选取物品(硬币)的最少个数,

vector<int >dp(amount+1);

2.初始化

 一维数组,特殊考虑dp[0]

dp[0]表示总和为0时,放硬币的个数,那必然为0

其它值我们应该初始化为不影响寻找最小值的

所以可以在定义时顺手初始化为INT_MAX

vector<int >dp(amount+1,INT_MAX);

dp[0]=0

3.遍历顺序

 由于这一题求的是元素个数,那么它是组合问题也好,排序问题也罢

都不会影响结果

所以先遍历背包再遍历物品,或者先遍历物品再遍历背包都可以

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

        for(j=0;j<=amount;j++){ // j 的初始值待商榷

 4.递推公式

可以模拟只放第一种硬币来思考一下,

假如第一种硬币面额为2,需要硬币总额为10

那么:

dp[1]=INT_MAX(由于单个面额过大所以放不了,对当前值不做处理,依旧是初始化的INT_MAX),

dp[2]=1

dp[3]=INT_MAX

dp[4]=2

...

假如可以选择面额为2,5的两种硬币,总额依旧为10

那么

dp[1]=INT_MAX(塞不进去保留前面的状态)

dp[2]=1(不能塞5,保留)

dp[3]=INT_MAX(同上)

dp[4]=2(同上)

dp[5]=1=dp[0]+1(放入5需要清空前面的,所以变为dp[0],但我们会假如一枚硬币5,所以+1)

dp[6]=3

....

所以不放/放不进来情况下,dp[j]保持不变

腾出位置放入,dp[j]=dp[j-coins[i]]+1

或许看到这个式子会有疑问,

用j减去coins[i]这个i是当前值(假如当前j=6,coins[i]=4),那怎么不算我减少了2个硬币2呢?

确实,我们从6中腾出4个容量,是取出了2个硬币,加入4又增加了1,最后应该是2个

而dp[6]直接按照公式就是=dp[2]+1=1+1=2

就是当前取出4,被保留的是2状态,这是符合我们的放取逻辑的

最终递推公式为

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

填个坑!

此外需要注意的是出现下标为j-coins[i],那么不能数组越界,

所以j的初始值应该设置为j=coins[i]

最后应该返回dp[amount]

但同时题目要求:如果没有任何一种硬币组合能组成总金额,返回 -1 。

那怎么样算是没有组合呢?

当然就是还是初始值,没有发生改变的情况

if(dp[amount]==INT_MAX) return -1;

完整代码如下!

code

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int n=coins.size();
        vector<int> dp(amount+1,INT_MAX);
        dp[0]=0;
        for(int i=0;i<n;i++){
            for(int j=coins[i];j<=amount;j++){
                if (dp[j - coins[i]] != INT_MAX) { // 如果dp[j - coins[i]]是初始值则跳过
                    dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
                }
            }
        }
        if(dp[amount]==INT_MAX) return -1;
        return dp[amount];
    }
};

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

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

相关文章

Geotools结合SLD实现矢量中文标注下的乱码和可用字体解析

目录 前言 一、需求溯源 1、原始的SLD渲染 2、最初的效果 二、问题修复 1、还是字符编码 2、如何选择可用的字体 3、如何查看支持的字体库 三、总结 前言 随着地理信息系统&#xff08;GIS&#xff09;技术的不断发展&#xff0c;矢量数据的可视化和标注成为了地理信息展…

基于Python与CATIA V5的斐波那契螺旋线自动化建模技术解析

引言 斐波那契螺旋线&#xff08;Fibonacci Spiral&#xff09;作为自然界广泛存在的黄金比例曲线&#xff0c;在工业设计、产品造型、机械工程等领域具有重要应用价值。本文将以Python控制CATIA V5进行参数化建模为例&#xff0c;深入解析三维CAD环境中复杂数学曲线的自动化生…

动态规划(11.按摩师)

题目链接&#xff1a;面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 状态表示&#xff1a; 对于简单的线性 dp &#xff0c;我们可以⽤「经验 题⽬要求」来定义状态表⽰&#xff1a; 以某个位置为结尾&#xff0c;巴拉巴拉&#xff1b;…

CentOS下安装Docker,Docker下安装JDK\MYSQL\REDIS\NGINX

先用VM安装好Centos8.5&#xff0c;可以选择安装迷你版&#xff0c;我安装的是UI版。 然后用MobaXterm_Portable_v23.0_cn连上去&#xff0c;互访成功就可以往下操作。 1. 修改文件&#xff1a;就是要把之前的mirror替换成现在的vault cd /etc/yum.repos.d/sed -i s/mirrorl…

demo.launch(inbrowser=True, share=True)无法生成共享网址

Gradio 的共享功能无法正常工作&#xff0c;原因是缺少一个名为 frpc_windows_amd64_v0.3 用到代码 app.demo.launch(show_errorTrue, inbrowserTrue, shareTrue) show_errorTrue&#xff1a;这个参数的作用是当应用在启动过程中出现错误时&#xff0c;会显示错误信息。这对于调…

翻译: 人工智能如何让世界变得更美好二

Basic assumptions and framework 基本假设和框架 To make this whole essay more precise and grounded, it’s helpful to specify clearly what we mean by powerful AI (i.e. the threshold at which the 5-10 year clock starts counting), as well as laying out a fram…

【vue】editor富文本输入全英文,谷歌浏览器:元素不会自动换行bug

【vue】editor富文本输入全英文&#xff0c;谷歌浏览器&#xff1a;元素不会自动换行bug 解决方案&#xff1a;给元素一个宽度 100% .editor {width: 100%; }

# OpenCV实现人脸与微笑检测:从图像到视频的实战应用

OpenCV实现人脸与微笑检测&#xff1a;从图像到视频的实战应用 在计算机视觉领域&#xff0c;人脸检测和微笑检测是两个非常有趣且实用的任务。它们广泛应用于智能监控、社交媒体分析、人机交互等多个场景。本文将通过两个代码示例&#xff0c;详细介绍如何使用OpenCV实现人脸…

Kubernetes可视化面板——KubePi(Kubernetes Visualization Panel - kubepi)

Kubernetes可视化管理面板——KubePi 在云计算和容器化的大潮下&#xff0c;Kubernetes 已成为管理容器集群的事实标准。然而&#xff0c;面对复杂的集群管理和运维工作&#xff0c;一个直观、易用的可视化工具显得至关重要。KubePi 正是为此而生——一款专为简化 Kubernetes …

【区块链安全 | 第二十三篇】单位和全局可用变量(一)

文章目录 单位和全局可用变量&#xff08;Units and Globally Available Variables&#xff09;以太单位&#xff08;Ether Units&#xff09;时间单位&#xff08;Time Units&#xff09;保留关键字 单位和全局可用变量&#xff08;Units and Globally Available Variables&am…

权重参数矩阵

目录 1. 权重参数矩阵的定义与作用 2. 权重矩阵的初始化与训练 3. 权重矩阵的解读与分析 (1) 可视化权重分布 (2) 统计指标分析 4. 权重矩阵的常见问题与优化 (1) 过拟合与欠拟合 (2) 梯度问题 (3) 权重对称性问题 5. 实际应用示例 案例1&#xff1a;全连接网络中的…

【现代深度学习技术】现代卷积神经网络06:残差网络(ResNet)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

《异常检测——从经典算法到深度学习》30. 在线服务系统中重复故障的可操作和可解释的故障定位

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

nut-ui下拉选的实现方式:nut-menu

nut-ui下拉选的实现方式&#xff1a;nut-menu 官方文档&#xff1a;https://nutui.jd.com/h5/vue/4x/#/zh-CN/component/menu 案例截图&#xff1a; nut-tab选项卡组件实现&#xff1a; 官方组件地址&#xff1a;https://nutui.jd.com/h5/vue/4x/#/zh-CN/component/tabs nut…

鸿蒙NEXT小游戏开发:扫雷

1. 引言 本文将介绍如何使用鸿蒙NEXT框架开发一个简单的扫雷游戏。通过本案例&#xff0c;您将学习到如何利用鸿蒙NEXT的组件化特性、状态管理以及用户交互设计来构建一个完整的游戏应用。 2. 环境准备 电脑系统&#xff1a;windows 10 工程版本&#xff1a;API 12 真机&…

LangChain4j 入门(二)

LangChain 整合 SpringBoot 下述代码均使用 阿里云百炼平台 提供的模型。 创建项目&#xff0c;引入依赖 通过 IDEA 创建 SpringBoot 项目&#xff0c;并引入 Spring Web 依赖&#xff0c;SpringBoot 推荐使用 3.x 版本。 引入 LangChain4j 和 WebFlux 依赖 <!--阿里云 D…

npm i 失败

当npm i 失败 且提示下面的错误 尝试降低npm 的版本 npm install npm6.14.15 -g

音视频基础(音视频的录制和播放原理)

文章目录 一、录制原理**1. 音视频数据解析****2. 音频处理流程****3. 视频处理流程****4. 同步控制****5. 关键技术点****总结** 二、播放原理**1. 音视频数据解析****2. 音频处理流程****3. 视频处理流程****4. 同步控制****5. 关键技术点****总结** 一、录制原理 这张图展示…

回溯(子集型):分割回文串

一、多维递归 -> 回溯 1.1&#xff1a;17. 电话号码的字母组合(力扣hot100&#xff09; 代码&#xff1a; mapping ["","", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv&qu…

2022年蓝桥杯第十三届CC++大学B组真题及代码

目录 1A&#xff1a;九进制转十进制 2B&#xff1a;顺子日期&#xff08;存在争议&#xff09; 3C&#xff1a;刷题统计 解析代码&#xff08;模拟&#xff09; 4D&#xff1a;修剪灌木 解析代码&#xff08;找规律&#xff09; 5E&#xff1a;X进制减法 解析代码1&…