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)。

相关推荐
wzdark14 分钟前
动态规划算法的状态转移矩阵可视化分析5
算法·矩阵·动态规划
Pniubi19 分钟前
力扣70爬楼梯
数据结构·算法·leetcode
人工智能培训23 分钟前
具身智能环境交互与学习范式原理
大数据·linux·人工智能·学习·算法·机器学习
wuminyu1 小时前
Continuation::freeze与thaw的x86_64汇编Stack Chunk拆解源码分析
java·linux·c语言·汇编·jvm·c++
kunicoding1 小时前
C++ 策略模式实战:写一个可以“一键换输出“的日志系统
开发语言·c++·策略模式
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》项目背景、目标及名词解释
服务器·网络·c++·语言模型
艾莉丝努力练剑1 小时前
【AI大模型接入SDK】ChatServer接口设计规范
网络·c++·人工智能·学习·大模型·设计规范
纪念 2291 小时前
C++算法(三)
开发语言·c++·算法
学不会pwn不改名1 小时前
时间复杂度与空间复杂度详解
算法
AbandonForce1 小时前
递归、搜索与回溯:从板书到二叉树解题方法
c++·算法·决策树