本文主要是介绍377. 组合总和 Ⅳ 70.魔改爬楼梯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
377. 组合总和 Ⅳ
题目:
给一个正整数数组和一个正整数目标值,数组的每个元素可取无限次,求总额达到目标值的最大排列数。
dp[j]含义:
dp[j]:达到目标值j的整数组合数为dp[j]
递推公式:
求装满背包有几种方法(组合,排列数)用:dp[j] += dp[j - nums[i]];
初始化:
dp[0]=1
遍历顺序:
先物品后背包:最大组合数
先背包后物品:最大排列数
总代码:
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
遍历顺序:
先物品后背包:最大组合数
先背包后物品:最大排列数
求排列数,所以先背包后物体
总代码:
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];}
};
这篇关于377. 组合总和 Ⅳ 70.魔改爬楼梯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!