377. 组合总和 Ⅳ 70.魔改爬楼梯

377. 组合总和 Ⅳ

题目:

给一个正整数数组和一个正整数目标值,数组的每个元素可取无限次,求总额达到目标值的最大排列数。

dp[j]含义:

dp[j]:达到目标值j的整数组合数为dp[j]

递推公式:

求装满背包有几种方法(组合,排列数)用:dp[j] += dp[j - nums[i]];

初始化:

dp[0]=1

遍历顺序:

先物品后背包:最大组合数

先背包后物品:最大排列数

总代码:

cpp 复制代码
class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        vector<int> dp(target + 1, 0);
        dp[0] = 1;
        for (int i = 0; i <= target; i++) { // 遍历背包
            for (int j = 0; j < nums.size(); j++) { // 遍历物品
//C++测试用例有两个数相加超过力扣int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。
                if (i - nums[j] >= 0 && dp[i] < INT_MAX - dp[i - nums[j]]) {
                    dp[i] += dp[i - nums[j]];
                }
            }
        }
        return dp[target];
    }
};

70.魔改爬楼梯

题目:代码随想录

一步一个台阶,两个台阶,三个台阶,.......,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢?

思路:

相当于:给了一个1-m的数组,数组元素可取无数次,到达总数为m的最大排列数。

dp[j]含义

dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法。

递推公式:

求装满背包(爬到目标楼梯)有几种方法(组合,排列数)用:dp[j] += dp[j - nums[i]];

nums[i]一般指当前为 i 的物品,这题num[i]有1----m,但没有数组的形式,所以dp[j]+=dp[j-i]

初始化:

dp[0]=1

遍历顺序:

先物品后背包:最大组合数

先背包后物品:最大排列数

求排列数,所以先背包后物体

总代码:

cpp 复制代码
class Solution {
public:
    int climbStairs(int n) {
        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];
    }
};
相关推荐
wclass-zhengge14 分钟前
数据结构篇(绪论)
java·数据结构·算法
Dylanioucn14 分钟前
【分布式微服务云原生】探索Redis:数据结构的艺术与科学
数据结构·redis·分布式·缓存·中间件
何事驚慌15 分钟前
2024/10/5 数据结构打卡
java·数据结构·算法
结衣结衣.15 分钟前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
大三觉醒push亡羊补牢女娲补天版16 分钟前
数据结构之排序(5)
数据结构
TJKFYY17 分钟前
Java.数据结构.HashSet
java·开发语言·数据结构
卡皮巴拉吖33 分钟前
【堆排】为何使用向下调整法建堆比向上调整法建堆更好呢?
数据结构
大二转专业3 小时前
408算法题leetcode--第24天
考研·算法·leetcode
凭栏落花侧3 小时前
决策树:简单易懂的预测模型
人工智能·算法·决策树·机器学习·信息可视化·数据挖掘·数据分析
Starry_hello world4 小时前
二叉树实现
数据结构·笔记·有问必答