Day44| Leetcode 518. 零钱兑换 II Leetcode 377. 组合总和 Ⅳ

今天进入完全背包。

Leetcode 518. 零钱兑换 II

题目链接 518 零钱兑换 II

由于是可以选取多个元素,所以是完全背包,要注意在遍历顺序中前序遍历,其他的和前面的目标数这个题目类似,要理解dp[j]+=dp[j-nums[i]]的来源。(总体来是还是比较难想的)

下面上代码:

cpp 复制代码
class Solution {
public:
    int change(int amount, vector<int>& coins) {
        vector<int> dp(amount+1,0);
        dp[0] = 1;
        for(int i=0;i<coins.size();i++){
            for(int j=coins[i];j<=amount;j++){
                //dp的含义:容量j下能装下的元素的组合数
                dp[j] += dp[j-coins[i]];
            }
        }
        return dp[amount];
    }
};

Leetcode 377. 组合总和 Ⅳ

题目链接 377 组合总和 Ⅳ

本题目就是上个题目的改版,这个要求的是排列数,所以我们只需先便利背包,在遍历物品即可(原因卡哥讲过),还要注意C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。

直接上代码:

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]&& dp[i] < INT_MAX - dp[i - nums[j]]){//C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。
                    dp[i] += dp[i-nums[j]];
                }
            }
        }
        return dp[target];
    }
};

end

相关推荐
EterNity_TiMe_5 分钟前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
ifanatic13 分钟前
[面试]-golang基础面试题总结
面试·职场和发展·golang
机器学习之心16 分钟前
一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
算法·lstm·transformer·北方苍鹰算法优化·多变量回归预测·ngo-transformer
yyt_cdeyyds26 分钟前
FIFO和LRU算法实现操作系统中主存管理
算法
alphaTao1 小时前
LeetCode 每日一题 2024/11/18-2024/11/24
算法·leetcode
kitesxian1 小时前
Leetcode448. 找到所有数组中消失的数字(HOT100)+Leetcode139. 单词拆分(HOT100)
数据结构·算法·leetcode
VertexGeek2 小时前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
石小石Orz2 小时前
Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~
javascript·人工智能·算法
jiao_mrswang3 小时前
leetcode-18-四数之和
算法·leetcode·职场和发展
qystca3 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法