当前位置: 首页 > article >正文

代码随想录算法【Day38】

Day38

322. 零钱兑换

思路

完全背包

代码

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount + 1, INT_MAX);
        dp[0] = 0;
        for (int i = 0; i < coins.size(); i++) { // 遍历物品
            for (int j = coins[i]; j <= amount; j++) { // 遍历背包
                if (dp[j - coins[i]] != INT_MAX) { // 如果dp[j - coins[i]]是初始值则跳过
                    dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
                }
            }
        }
        if (dp[amount] == INT_MAX) return -1;
        return dp[amount];
    }
};

五部曲

1.dp数组及下标定义:凑足金额j所需钱币的最小个数

2.递推公式:dp[j] = min( dp[j - coins[i]] + 1, dp[j] )

3.初始化:dp[0] = 0; 其余数组初始化为INT_MAX

4.遍历顺序:钱币有顺序和无顺序都可以,不影响最终结果,所以内外层循环可以先物品,后背包;也可以先背包,后物品。

5.数组的数据应该是怎样的:

思考

一、代码中为什么有这样一句“if (dp[j - coins[i]] != INT_MAX)”

dp[j - coins[i]] 的值为 INT_MAX 时,表示无法用当前硬币组合出金额 j - coins[i]。此时若强行进行 dp[j - coins[i]] + 1 的计算,会导致整数溢出(例如 INT_MAX + 1 会变成负数)。

二、

如果求组合数就是外层for循环遍历物品,内层for遍历背包。

如果求排列数就是外层for遍历背包,内层for循环遍历物品。


http://www.kler.cn/a/536307.html

相关文章:

  • 使用git clone一个指定文件或者目录
  • 微软发布基于PostgreSQL的开源文档数据库平台DocumentDB
  • Windows系统使用Git教程详解
  • 使用多模态大语言模型进行深度学习的图像、文本和语音数据增强
  • 【创建模式-单例模式(Singleton Pattern)】
  • C语言-----数据结构从门到精通
  • SQL Server查询计划操作符(7.3)——查询计划相关操作符(6)
  • 第4节课:控制结构 - 条件语句、循环语句
  • 本地私有化部署 DeepSeek Dify ,告别“服务器繁忙,请稍后再试”
  • 小米官博宣布:首款AI眼镜即将发布
  • Java实现网络安全编程数字信封 网络安全 java
  • 深入解析:如何利用 Python 爬虫获取商品 SKU 详细信息
  • 深入理解 YUV Planar 和色度二次采样 —— 视频处理的核心技术
  • 第30节课:前端架构与设计模式—构建高效可维护的Web应用
  • 《金字塔原理》笔记
  • 【JS】element-ui 中 table的select事件
  • source 与 shell 之详解(Detailed Explanation of Source and Shell)
  • 集合类不安全问题
  • tqdm用法教程
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter5-基本引用类型
  • Python调取本地MongoDB招投标数据库,并结合Ollama部署的DeepSeek-R1-8B模型来制作招投标垂直领域模型
  • Git(分布式版本控制系统)系统学习笔记【并利用腾讯云的CODING和Windows上的Git工具来实操】
  • 7.list
  • Kotlin协程详解——协程取消与超时
  • 博主卖DeepSeek相关课程1天收入50000元
  • 鸿蒙北向开发OpenHarmony4.1 DevEco Studio开发工具安装与配置