码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 322 零钱兑换

时间:2020-06-13 17:24:42      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:实现   leetcode   组成   pre   背包问题   问题   组合   示例   代码   

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 零钱兑换

标签:实现   leetcode   组成   pre   背包问题   问题   组合   示例   代码   

原文地址:https://www.cnblogs.com/zygote/p/13118231.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!