【LeetCode-动态规划】零钱兑换

题目描述

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
注意:
给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。
示例:

输入: [1,2,3]
输出: 6

输入: [1,2,3,4]
输出: 24

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

思路

用动态规划来做。令dp[i]表示凑成金额i所需要的最少的硬币个数,假设有两种面值不同的金币c1, c2,则有dp[i] = min(dp[i-cj])+1,j=1或者2,i>=cj。代码如下:

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int MAX = amount+1;
        vector<int> dp(amount+1, MAX);
        dp[0] = 0;
        for(int i=1; i<=amount; i++){
            for(int j=0; j<coins.size(); j++){
                if(i>=coins[j]){
                    dp[i] = min(dp[i], dp[i-coins[j]]+1);
                }
            }
        }
        return dp[amount]==MAX? -1:dp[amount];
    }
};
  • 时间复杂度:O(sn)
    其中,s为金额,n为面额数。
  • 空间复杂度:O(s)
    s为金额。
posted @ 2020-04-20 20:40  Flix  阅读(213)  评论(0编辑  收藏  举报