LeetCode 322 零钱兑换

Posted zygote

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 322 零钱兑换相关的知识,希望对你有一定的参考价值。

1.题目链接

https://leetcode-cn.com/problems/coin-change/

2.题目描述

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

 

示例 1:

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

输出: 3

解释: 11 = 5 + 5 + 1

 

示例 2:

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

输出: -1

 

说明:

 

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

 

3.题目解析

这道题目可以看做背包问题,用动态规划实现,dp[i]为金额i需要最少金额的个数,对于任意金额jdp[j] = Min(dp[j], dp[j - coins[i]] + 1);如果j - coins[i]存在,既能满足条件。

4.代码实现

int Min(int a, int b)
{
    if(a < b)
        return a;
    else
        return b;
}
int coinChange(int* coins, int coinsSize, int amount){
    
    int *dp = (int*)malloc((amount + 1) * sizeof(int));
    dp[0] = 0;
    for (int i = 1; i <= amount; i++) { 
        dp[i] = amount + 1;
    }
    for (int i = 0; i < coinsSize; i++) {
        for (int j = coins[i]; j < amount + 1; j++) {
                dp[j] = Min(dp[j], dp[j - coins[i]] + 1);
        }
    }
    if (dp[amount] > amount)
        return -1;
    return dp[amount];
}

5.提交记录

技术图片

技术图片

 

执行用时分布 

技术图片

 

以上是关于LeetCode 322 零钱兑换的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode322. 零钱兑换(dp)

Leetcode.322-零钱兑换(最大/小型动态规划)

Leetcode.322-零钱兑换(最大/小型动态规划)

leetcode 322. 零钱兑换

322-零钱兑换

LeetCode:零钱兑换322DP