算法设计与分析:Coin Change(Week 12) - Go语言中文社区

算法设计与分析:Coin Change(Week 12)


学号:16340008

题目:322. Coin Change


Question:

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

Example 1:

Input: coins = [1, 2, 5], amount = 11
Output: 3 
Explanation: 11 = 5 + 5 + 1

Example 2:

Input: coins = [2], amount = 3
Output: -1

Note:
You may assume that you have an infinite number of each kind of coin.


Answer:

题意是我们有不同价值的硬币,以及一个数amount。需要求如何用最少的硬币数使其总价值为amount(若能凑出),否则返回-1。考虑到比较容易想到的动态规划的办法,就是将求凑出一个amount0需要的硬币数,且amount0能用一个硬币就得到amount,于是F(amount) = F(amount0) + 1

于是我们有了如下算法:

  1. 对于一个amount,遍历硬币种类n,得到一个数组num[n],其每个元素都是amount - coin,coin是其中一个硬币
  2. 令F(amount)为F(num[i])(0 <= i < n)中的最小值+1,对求每个num[i]使用步骤1,2

以上是初步的方法,但是我们知道对于以上方法一个F(amount0)可能被求多次,导致时间的浪费,我们可以十分习惯的使用一个数组array[amount-1]来记录我们求过的F(num)。

因此我们可以得到改进的方法:

我们先初始化array[]为0,而且考虑自底向上。自底向上可以使模型更直观,而且我们能保证求的元素之前的元素都已是最佳方案。于是得到算法如下:

  1. 初始化数组array[amount+1]为一个足够大的值(无穷大或amount+1),且array[0] = 0。对array[1]到array[amount]作步骤2
  2. coins中每个coin作步骤3
  3. 如果coin <= amount,则array[i]赋值为array[i]与array[i-coin]+1中的较小值。
  4. 完成步骤1,2,3后,检查array[amount]不是原来的大值,是的话则返回array[amount],否则返回-1(没有凑出amount的方法)

此时的时间复杂度十分明显,我们知道步骤1和2分别是两个for,1嵌套2,因此时间复杂度就是O(count * amount),而空间复杂度就是数组长度(O(amount))。我们能得到以下代码(python3):

class Solution:
    def coinChange(self, coins, amount):
        """
        :type coins: List[int]
        :type amount: int
        :rtype: int
        """
        array = [amount + 1] * (amount + 1)
        array[0] = 0

        for i in range(1, amount + 1):
            for coin in coins:
                if (coin <= i):
                    array[i] = min(array[i], array[i - coin] + 1)
        
        if array[amount] != amount + 1:
            return array[amount]
        else:
            return -1

本地测试代码:

coins = [1, 2, 5]
amount = 11
test = Solution()
print(test.coinChange(coins, amount))

提交结果:

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/c980129/article/details/84402680
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-19 12:29:27
  • 阅读 ( 1159 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢