经典动态规划题目leetcode322. 零钱兑换

本文介绍了如何使用C++实现LeetCode上的硬币兑换问题的动态规划解决方案,通过计算不同面额硬币组合下兑换给定金额所需的最少硬币数,包括示例代码解释和逻辑分析。
摘要由CSDN通过智能技术生成

题目链接:https://leetcode.cn/problems/coin-change/description/

给你一个整数数组 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] <= 231 - 1
0 <= amount <= 104

AC代码

#include <iostream>
#include <vector>

using namespace std;

int coinChange(vector<int>& coins, int amount) {
    vector<int> dp(amount + 1, amount + 1);
    dp[0] = 0;
    for (int coin : coins) {
        for (int i = coin; i <= amount; ++i) {
            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;
    cout << coinChange(coins, amount) << endl;
    return 0;
}

代码解释
这个C++程序首先定义了一个动态规划数组dp,其中dp[i]表示兑换i元所需的最少硬币数量。初始化时,dp[0]被设置为0,其他位置被设置为一个很大的数(这里设置为amount + 1)。

然后,程序遍历每个硬币,对于每个硬币,程序遍历从该硬币面值到amount的所有金额,更新dp数组。具体来说,对于每个金额i,程序比较兑换i元所需的最少硬币数量和兑换i - coin元所需的最少硬币数量加上1(即使用当前硬币),取两者中的最小值。

最后,程序返回dp[amount],即兑换amount元所需的最少硬币数量。如果dp[amount]大于amount,则表示无法兑换,返回-1。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值