LeetCode 算法:零钱兑换 c++

  • 原题链接🔗:零钱兑换
  • 难度:中等⭐️⭐️

题目

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11

输出:3

解释:11 = 5 + 5 + 1
示例 2:

输入:coins = [2], amount = 3

输出:-1
示例 3:

输入:coins = [1], amount = 0

输出:0

提示:

1 <= coins.length <= 12

1 <= coins[i] <= 2^31^ - 1

0 <= amount <= 10^4^

题解

  1. 解题思路:

LeetCode上的"零钱兑换"问题是一个典型的动态规划问题。题目要求给定不同面额的硬币和一个总金额,求出组成总金额的最少硬币数。以下是这个问题的解题思路:

  1. 问题描述

    给定不同面额的硬币和一个总金额。写出一个函数来计算可以组成总金额的最少硬币数。如果无法组成总金额,返回-1。

  2. 输入

  • coins: 一个整数数组,表示不同面额的硬币。
  • amount: 一个整数,表示总金额。
  1. 输出
  • 一个整数,表示组成总金额的最少硬币数。如果无法组成总金额,返回-1。
  1. 动态规划解题思路

    1. 定义状态dp[i] 表示组成金额 i 所需的最少硬币数。

    2. 确定状态转移方程

      • 如果没有硬币或者金额为0,那么硬币数为0:dp[0] = 0
      • 对于每个金额 i,我们尝试所有小于等于 i 的硬币面额 coin,更新状态:dp[i] = min(dp[i], dp[i - coin] + 1)
    3. 确定初始状态和边界条件

      • 初始化 dp 数组,大小为 amount + 1,所有元素设为一个足够大的数(比如 amount + 1),因为最少硬币数不会超过总金额。
      • dp[0] 初始化为0。
    4. 计算顺序

      • 1amount 遍历每个金额,对于每个金额,遍历所有硬币面额,更新 dp[i]
    5. 构造最优解

      • 如果 dp[amount] 仍然为初始化时的较大值,则表示无法组成该金额,返回-1。
      • 否则,返回 dp[amount]
  1. c++ demo:
cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

// 动态规划求解零钱兑换问题的函数
int coinChange(vector<int>& coins, int amount) {
    vector<int> dp(amount + 1, amount + 1); // 初始化为最大值
    dp[0] = 0; // 金额为0时,硬币数为0

    for (int i = 1; i <= amount; ++i) {
        for (int coin : coins) {
            if (i - coin >= 0) {
                dp[i] = min(dp[i], dp[i - coin] + 1);
            }
        }
    }

    return dp[amount] > amount ? -1 : dp[amount];
}

// 主函数,用于测试零钱兑换算法
int main() {
    vector<int> coins = { 1, 2, 5 }; // 硬币面额
    int amount = 11; // 总金额

    int result = coinChange(coins, amount);
    if (result != -1) {
        cout << "Minimum number of coins required: " << result << endl;
    }
    else {
        cout << "Not possible to make the amount with given coins" << endl;
    }

    return 0;
}
  • 输出结果:

Minimum number of coins required: 3

  1. 代码仓库:coinChange
相关推荐
坊钰32 分钟前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
巫师不要去魔法部乱说1 小时前
PyCharm专项训练4 最小生成树算法
算法·pycharm
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解GLSMOP1-GLSMOP9及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·机器学习·matlab·强化学习
阿七想学习1 小时前
数据结构《排序》
java·数据结构·学习·算法·排序算法
王老师青少年编程1 小时前
gesp(二级)(12)洛谷:B3955:[GESP202403 二级] 小杨的日字矩阵
c++·算法·矩阵·gesp·csp·信奥赛
Kenneth風车2 小时前
【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)111
算法·机器学习·分类
越甲八千2 小时前
总结一下数据结构 树 的种类
数据结构
eternal__day2 小时前
数据结构(哈希表(中)纯概念版)
java·数据结构·算法·哈希算法·推荐算法
APP 肖提莫2 小时前
MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
java·前端·算法
OTWOL2 小时前
两道数组有关的OJ练习题
c语言·开发语言·数据结构·c++·算法