322. Coin Change

322. Coin Change
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:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)

Example 2:
coins = [2], amount = 3
return -1.

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

Functional Interface:
int coinChange(vector<int>& coins, int amount)

已知我们有n种面额的钱币,从小到大依次存入coin中,之后我们一共要凑够amount的金额,并且要使总钱币的个数最小;若是不存在,则返回-1。

这道题实际上是一道动态规划的找零问题。我们想求总金额为amount的最小钱币数,也就是要求amount-小于amount的最大面额的最小钱币数。所以我们可以从最小金额(1,对于0来说,最小钱币数永远是0)开始求解最小钱币数,通过循环,依次求解金额(i)为1~amount的最小钱币数。对于每一个金额,我们都有

result[i]=min(result[i],result[icoins[j]]+1) r e s u l t [ i ] = m i n ( r e s u l t [ i ] , r e s u l t [ i − c o i n s [ j ] ] + 1 )
其中i是金额,j是指第j种面额,result是存储各个金额的最小钱币数。

对于不存在在的情况,我们则将其设为一个很大的值(infinity)。由上述公式可知,若是某种金额不存在找零的情况,那么其result[i-coins[j]]必然会是infinite,因为它也不存在找零情况。也就是说,所有不存在找零的金额,它对应的result中存储的值一定为infinity,那么必然有当当我们求解完amount的最小钱币数时,若是为infinity,则意味着改金额不存在找零的情况,返回-1,其余情况则返回求得的最小钱币数。

参考代码如下:

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int infinity = 2*amount;
        vector<int> result(amount+1, infinity);
        result[0] = 0;
        for(int i = 1; i <= amount; i++) {
            for(int j = 0; j < coins.size(); j++) {
                if(i >= coins[j]) {
                    int min = result[i];
                    if(result[i - coins[j]] + 1 < min)
                        min = result[i - coins[j]] + 1;
                    result[i] = min;
                }
            }
        }
        if(result[amount] > amount)
            return -1;
        else
            return result[amount];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值