Coin Change - leetcode 322号题目个人题解

来源:互联网 发布:上海淘宝拍摄基地 编辑:程序博客网 时间:2024/05/16 15:22

题目要求

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.

解题思路

使用一个一维数组来解决这个问题,数组cnt[i]表示组成i元最少要使用多少枚硬币。如果cnt[i]的值是65535的话,说明所给的硬币不能组成元。于是我们可以得到状态转移方程:

cnt[i] = min(cnt[i],cnt[i-coins[0]]+1,cnt[i-coins[1]]+1,...,cnt[i-coins[n]]+1)

代码实现如下:

代码实现

class Solution {public:int coinChange(vector<int>& coins, int amount) {    if(amount < 0) return -1;    int cnt[10000];    for(int i = 0;i<10000;i++) cnt[i] = 65535;    cnt[0] = 0;    for(int i=1; i<=amount; ++i) {        for(int j=0; j<coins.size(); ++j) {            if(i>=coins[j]) {                cnt[i] = min(cnt[i], cnt[i-coins[j]] + 1);            }        }    }    if(cnt[amount]!=65535) return cnt[amount];    else return -1;}};

复杂度分析

该算法的复杂度应该是O(n^2)的。

0 0