代码随想录算法训练营第三十七天-动态规划-完全背包-377. 组合总和 Ⅳ

  • 这是一道与上一题几乎一样的题目
  • 不同点是在上一题是组合,这道题是排列
  • 所以就要用先循环背包,内循环为物品来实现排列效果
  • 总结:
    • 对纯完全背包,求装满这个背包的最大价值,或者问能不能装满这个背包,那么两层for循环不分内外,谁在外层或内层都没有影响
    • 如果问题变为装满这个背包有多少种方法,求
  • 扩展:这道题与爬楼梯类似
    • 爬楼梯是有两种方式,一层或二层,如果有m层呢,就相当于本题集合中元素有{1, 2, 3,..., m},代表了m种爬楼梯方法(值代表一次可以爬的层数),问到达楼顶有多少种方法,这其中的楼顶层数就类似于本题中的target(万万没想到这还能联系上)
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++) { // 遍历物品
                if (i - nums[j] >= 0 && dp[i] < INT_MAX - dp[i - nums[j]]) {
                    dp[i] += dp[i - nums[j]];
                }
            }
        }
        return dp[target];
    }
};
  • 测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]
  • 汇总
相关推荐
无敌秋16 分钟前
C++ 抽象工厂模式实战指南
开发语言·c++·抽象工厂模式
Chat_zhanggong34523 分钟前
主推NT98336BG作用有哪些?
嵌入式硬件·算法
CoderMeijun30 分钟前
C++ 智能指针:auto_ptr
c++·内存管理·智能指针·raii·auto_ptr
wuminyu34 分钟前
专家视角看Lambda表达式的原理解析
java·linux·c语言·jvm·c++
Run_Teenage42 分钟前
算法:线段树
算法
Westward-sun.44 分钟前
YOLOv2算法全方位解析:从BatchNorm到聚类先验框的九大改进
算法·yolo·聚类
扶苏xw1 小时前
【离散化算法】
算法
码之气三段.1 小时前
Codeforces Round 1095 (Div. 2) 补题
算法
ximu_polaris1 小时前
设计模式(C++)-行为型模式-命令模式
c++·设计模式·命令模式
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 189. 轮转数组 | C++ 三次反转经典魔法 (O(1) 空间)
c++·算法·leetcode