Middle-题目94:322. Coin Change

原创 2016年05月31日 19:46:59

题目原文:
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.
题目大意:
假设你有若干面额的钱币,面额由数组coins给出,再给出一个总的钱币数amount。计算至少需要几枚钱币才能凑成amount?如果能,返回最小钱数,如果不能,返回-1.
例如:coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)
题目分析:
使用一个O(n2)的DP解决。设dp[i]代表钱数为i所需要的硬币数,先初始化dp[0]=0,dp[i]=MAX_VALUE-1(为什么这里有个-1稍后说明),然后转移关系是:
dp[i+coins[j]]=min0i+coins[j]amountdp[i]+1
即已知钱数i所需要的硬币数,可以推出再加一枚硬币可以表示的钱数.最终dp[amount]即为所求。(这时候看出来为什么写了个-1吗?)
源码:(language:java)

public class Solution {
    public int coinChange(int[] coins, int amount) {
        int dp[] = new int[amount + 1];
        for (int i = 1; i <= amount; i++) 
            dp[i] = Integer.MAX_VALUE-1;
        for (int i = 0; i <= amount; i++) {
            for (int j = 0; j < coins.length; j++) {
                if (i + coins[j] <= amount)
                    dp[i + coins[j]] = Math.min(dp[i + coins[j]], dp[i] + 1);
            }
        }
        return dp[amount] == Integer.MAX_VALUE-1 ? -1 : dp[amount];
    }
}

成绩:
23ms,beats 83.94%,众数25ms,9.55%
Cmershen的碎碎念:
读完代码之后应该能解释这个-1了。如果还没理解那么揭晓答案:计算机中用补码储存数字,所以如果不写-1,那么在第9行判断dp[i]+1的时候会造成溢出,导致变成MIN_VALUE,那么dp[i+coins[j]]不管是多少都会被冲掉。
此外这题好像可以用母函数在O(n)复杂度内做,我组合数学学得不好,也没查到具体的ac代码。(这题又是那个fighter.io出的,貌似他出的题总离不开数学)

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

Geeks 面试题: Coin Change最大找零方案数

Coin Change Given a value N, if we want to make change for N cents, and we have infinite supply ...
  • kenden23
  • kenden23
  • 2014年01月11日 12:41
  • 2703

Meet-in-the-middle思想的一些应用

 Meet in the middle(有时候也叫作split and merge)是一种用以获取足够高效解决方案的灵巧的思想。和分治思想非常类似,它将问题分割成两个部分,然后试着合并这两个子问...
  • lishuandao
  • lishuandao
  • 2015年10月16日 17:46
  • 1991

Coin Change(hdu2069,暴力or母函数)

http://acm.hdu.edu.cn/showproblem.php?pid=2069 Coin Change Time Limit: 1000/1000 MS (Java/Others...
  • JHC23
  • JHC23
  • 2013年08月18日 09:59
  • 1057

541. Reverse String II\322. Coin Change

Reverse String II541. Reverse String IIGiven a string and an integer k, you need to reverse the firs...
  • c602273091
  • c602273091
  • 2017年03月17日 22:22
  • 562

leetcode 322. Coin Change 解题思路 C语言

You are given coins of different denominations and a total amount of money amount. Write a function ...
  • github_34176503
  • github_34176503
  • 2016年03月31日 21:10
  • 431

LeetCode解题报告 322. Coin Change [medium]

题目描述 You are given coins of different denominations and a total amount of money amount. Write a...
  • conniemessi
  • conniemessi
  • 2017年01月05日 14:38
  • 111

LeetCode322. Coin Change

You are given coins of different denominations and a total amount of money amount. Write a function ...
  • fan2012huan
  • fan2012huan
  • 2016年09月13日 22:34
  • 248

Leetcode-322.Coin Change

题目: You are given coins of different denominations and a total amount of money amount. Write a funct...
  • caoyan_12727
  • caoyan_12727
  • 2016年10月29日 22:21
  • 177

(LeetCode 322) Coin Change

Q: You are given coins of different denominations and a total amount of money amount. Write a funct...
  • u014616233
  • u014616233
  • 2016年04月18日 11:16
  • 431

Leetcode 322. Coin Change (Medium) (cpp)

Leetcode 322. Coin Change (Medium) (cpp)
  • Niko_Ke
  • Niko_Ke
  • 2016年08月26日 16:17
  • 334
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目94:322. Coin Change
举报原因:
原因补充:

(最多只允许输入30个字)