leetcode:518. 零钱兑换 II[完全背包]

学习要点

  1. 理解完全背包思想
  2. 理解一维数组的解法

题目链接

518. 零钱兑换 II - 力扣(LeetCode)

题目描述

解法:二维数组

cpp 复制代码
class Solution {
public:
    int change(int amount, vector<int>& coins) {
        if (amount == 0)
            return 1;
        // dp[i][j]  0-i中任意无限取凑成j的最大方式
        int n = coins.size();
        vector<vector<uint64_t >> dp(n, vector<uint64_t>(amount + 1, 0));
        // 初始化
        for (int i = 1; i <= amount; i++) {
            if (i % coins[0] == 0) {
                dp[0][i] = 1;
            }
        }
        for (int i = 0; i < n; i++) {

            dp[i][0] = 1;
        }

        // 开始动归
        for (int i = 1; i < n; i++) {
            for (int j = 1; j <= amount; j++) {
                if (coins[i] > j) {
                    dp[i][j] = dp[i - 1][j];
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - coins[i]];
                }
            }
        }
        return dp[n - 1][amount];
    }
};

解法:一维数组

cpp 复制代码
class Solution {
public:
    int change(int amount, vector<int>& coins) {
        // 完全背包组合问题
        if(amount == 0) return 1;
        int n = coins.size();
        vector<uint64_t> dp(amount+1,0);
        // dp[j] = dp[j]上一层 + dp[j-coins[i]]这一层 
        dp[0] = 1;
        for(int i = 0;i<n;i++)
        {
            for(int j = coins[i];j<=amount;j++)
            {
               dp[j] += dp[j-coins[i]]; 
            }
        }
        return dp[amount];
    }
};
相关推荐
吃好睡好便好7 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅8 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue10 小时前
三角形数
笔记·算法·数论·组合数学
念何架构之路11 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星11 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑11 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光12 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩12 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_6294947312 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表
ʚ希希ɞ ྀ14 小时前
单词拆分----dp
算法