LeetCode 518. 零钱兑换 II(动态规划 完全背包)

题目:

链接:LeetCode 518. 零钱兑换 II

难度:中等

动态规划:

dpij 定义 :可选前 i 种硬币的情况下,组成金额 j 的组合数。
初始状态

  • dp0j = 0, 1 <= j <= amount(不选取任何硬币的情况下,组成正整数金额的组合数为0)
  • dpi0 = 1, 0 <= i <= n(金额为0的情况下,只有空集的这一种组合才是0)

状态转移方程

cpp 复制代码
	if(j - coins[i - 1] >= 0)  // 容量足够选取该硬币:组合数=选取该硬币和不选该硬币两种状态相加
		dp[i][j] = dp[i][j - coins[i - 1]] + dp[i - 1][j];
	else
		dp[i][j] = dp[i - 1][j];  // 容量不足以选取该硬币:组合数=不选该硬币的组合数

代码:

cpp 复制代码
class Solution {
public:
    int change(int amount, vector<int>& coins) {
        int n = coins.size();
        vector<vector<int>> dp(n + 1, vector<int>(amount + 1, 0));  // dp[i][j]:i代表使用前i种硬币,j代表金额
        for(int i = 0; i <= n; i++)  // 初始化,组成金额为0的方案数总是1(不选任何硬币)
            dp[i][0] = 1;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= amount; j++)
            {
                if(j - coins[i - 1] >= 0)  // 容量足够选取该硬币:组合数=选取该硬币和不选该硬币两种状态相加
                    dp[i][j] = dp[i][j - coins[i - 1]] + dp[i - 1][j];
                else
                    dp[i][j] = dp[i - 1][j];  // 容量不足以选取该硬币:组合数=不选该硬币的组合数
            }
        }
        return dp[n][amount];
    }
};

时间复杂度O(N * amount),N是coins数组长度。

空间复杂度O(N * amount)。

相关推荐
AI科技星20 分钟前
引电统一方程:严格推导与量纲零错误验证
人工智能·算法·机器学习·架构·学习方法
壹号用户25 分钟前
C++入门(引用)
数据结构·c++
lcj251134 分钟前
【list】手撕C++ list!从0到1实现双向链表,迭代器、const迭代器、模板全解析,面试官都惊呆了!
c++·笔记·链表·list
fengxin_rou42 分钟前
leetcode二维数组高频面试题详解:48.原地旋转矩阵 + 240.杨氏矩阵查找算法深度剖析
数据结构·leetcode·java 算法·面试算法
8Qi81 小时前
LeetCode 518:零钱兑换 II(Coin Change II)—— 题解 ✅
java·算法·leetcode·动态规划·完全背包
计算机安禾1 小时前
【算法分析与设计】第49篇:算法博弈论与机制设计
人工智能·算法·机器学习
玖釉-1 小时前
Vulkan Specialization Constants 详解:在“运行时配置”和“编译期优化”之间取得平衡
c++·windows·图形渲染
05候补工程师1 小时前
【408 数据结构】图论核心算法(拓扑/关键路径)与二叉搜索树精髓夺分笔记
数据结构·经验分享·笔记·考研·算法·图论
AC赳赳老秦1 小时前
OpenClaw+MySQL 深度应用:自动生成建表语句、索引优化建议与数据迁移脚本
开发语言·数据库·人工智能·python·mysql·算法·openclaw
奔袭的算法工程师1 小时前
论文解读--BEV-radar:: bidirectional radar-camera fusion for 3D object detection
人工智能·算法·目标检测·计算机视觉·自动驾驶·信号处理