爬楼梯(改写成完全背包)

简介: 爬楼梯(改写成完全背包)

4. 爬楼梯(改写成完全背包)


题目

原题为LeetCode-70,是一道简单动态规划,现改写为:


假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 m mm 个台阶。你有多少种不同的方法可以爬到楼顶呢


思路

一步爬一个或两个或三个或 m mm 个就是物品,楼顶就是背包,其实就是问装满背包的方法有多少种。再想这是排序数还是组合数?明显先2后1(先爬2阶楼梯再爬1阶楼梯)和先1后2是不同的方法,所以求的是排序数,那么就要求先遍历背包,嵌套遍历物品


五部曲


dp[j] 含义


爬到有 j  个台阶的楼顶的方法数

递推公式


d p [ j ] + = d p [ j − i ]

数组初始化


dp[0]=1

遍历顺序


上文已说明


代码实现

class Solution
{
public:
    int climbStairs(int n, int 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 >= 0)
                    dp[i] += dp[i - j];
            }
        }
        return dp[n];
    }
};


代码中m表示最多可以爬m个台阶,代码中把m改成2就是本题70.爬楼梯可以AC的代码了

目录
相关文章
|
2月前
|
存储
【洛谷 P1255】数楼梯 题解(递归+记忆化搜索+高精度)
这是一个使用动态规划解决的“数楼梯”问题。给定楼梯数`N`,求不同上楼方式的数量。程序通过递归函数`f()`计算,其中`f(x) = f(x - 1) + f(x - 2)`,初始条件`f(1) = 1`,`f(2) = 2`。考虑到数据规模可能很大,使用了高精度加法运算。样例输入`4`,输出`5`。代码中定义了一个存储中间结果的向量`mem`,并提供了一个用于显示高精度数的`printv()`函数。
25 0
|
3月前
代码随想录Day32 动态规划01 LeetCodeT509 斐波那契数列 T70 爬楼梯 T746 爬楼梯的最小消耗
代码随想录Day32 动态规划01 LeetCodeT509 斐波那契数列 T70 爬楼梯 T746 爬楼梯的最小消耗
43 0
|
3月前
代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集
代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集
32 0
|
9月前
【动态规划入门】动态规划思路五部曲_斐波那契_爬楼梯_最小花费爬楼梯
【动态规划入门】动态规划思路五部曲_斐波那契_爬楼梯_最小花费爬楼梯
49 0
|
算法
转:用一个例子说明Floyd算法
弗洛伊德算法(Floyd&#39;s algorithm)是一种用于求带权图中最短路径的算法,适用于带有正负权边的图(但不能有负环)。这种算法也有时被称为弗洛伊德-沃尔什算法。该算法基于动态规划,其时间复杂度为O(V^3),其中V是图中的顶点数。此外,该算法还可用于检测图中的负环并求出传递闭包。
106 2
|
Python
从斐波那契数列求和想到的俗手、本手和妙手
从斐波那契数列求和想到的俗手、本手和妙手
85 0
汉诺塔?爬楼梯?斐波那契?知道递归就够了
汉诺塔?爬楼梯?斐波那契?知道递归就够了
79 0
|
算法
完全背包例题(滚动数组)
完全背包例题(滚动数组)
107 0
多重背包例题
多重背包例题
83 0