Leetcode 322. Coin Change

来源:互联网 发布:迅捷路由器的访客网络 编辑:程序博客网 时间:2024/06/07 06:47

题目描述

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.

Example1:

coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)

Example2:

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

Note:

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

分析:

题目的要求是给定一些不同面值的硬币,问是否可以通过这些硬币配凑出给定的面值。
可以很容易地分析出,题目与完全背包问题是同一类型的问题。
让我们回忆一下什么是完全背包问题:

有N种物品和一个容量为V的背包,每种物品都有无限件可用。放入第i种
物品的费用是Ci,价值是Wi。求解:将哪些物品装入背包,可使这些物品的耗 费的费用总和不超过背包容量,且价值总和最大。

可以看到,完全背包问题与本题十分相似,只是做了些许的改变而已。
将本题中的每个硬币的面值等同于完全背包问题中没见物品的体积,而将要求的面值等同于背包的容量。最后,我们发现,背包问题中每件物品的费用Ci其实也是对应于每种硬币的面值,只是,这个条件在这个问题中并不重要,因为,题目的要求是获得某一面值所需要的最少的硬币数,因此,需要的硬币数也就作为我们度量结果的一个标准了。
我们可以看到,完全背包问题的解法的伪代码如下:

F[0..V]←0 for i ← 1 to N for v ← Ci to V F[v] ← max(F[v], F[v −Ci] +Wi)

可以看到,在第i次迭代中,F[v]表示的是对于容量为v的背包,前i件物品装进背包能获得的最大的价值,其中的状态转移方程也是01背包问题的状态转移方程。
现在,回过头来考虑本题,首先,应该也有一个状态转移方程以及方程变量的初始值。
用dp[i, v]来表示只使用前i种硬币获得总面值为v所需要的最少的硬币数。
可以写出状态转移方程如下:

dp[i, v] = min(dp[i - 1, v - K*coins[i]] + K)

同样,可以与完全背包问题的解法的空间复杂度的优化思想一样,用dp[v]来表示在第i次迭代(即用前i种硬币)获得总面值为v所需要的最少的硬币数。
接下来,就需要考虑d[v]的初始化的问题,有d[v]的物理意义可以知道,dp[v]的初始化的值表示的是不适用硬币达到v的面值,可以发现,只有v = 0的时候才可以实现,且dp[0]的值是0,而对于其他的面值,是无法达到的,此时,在本题中,可以将dp[v | v > 0]的值置为amount + 1,因为,在本题中硬币最小的面值是1,所以,达到amount面值最多也就需要amount个硬币,置为amount + 1表示不可达到。

代码:

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

运行结果

这里写图片描述

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 煮鸡 鸡腿炖香菇的做法 鸡肉炖什么好吃 鸡肉的做法大全煲汤 炖鸡汤的家常做法 鸡炖汤的做法大全 煮鸡腿的家常做法 鸡肉煲汤的做法大全 炖鸡汤的做法 怎么炖鸡汤 炖鸡肉的家常做法 香菇炖鸡腿 怎样炖鸡肉好吃 鸡腿的做法大全 炖鸡腿的家常做法 竹笋 竹笋的做法 竹笋的做法大全 炒竹笋的家常做法 什么的竹笋 笋子 炖鸡肉的做法 炖鸡翅的家常做法 炖鸡腿怎么做好吃 炖鸡汤的做法大全家常 炖鸡爪 炖鸡腿的做法 炖鸡翅 清炖老母鸡 炖全鸡 炖整鸡 花生炖鸡爪 孕妇能吃天麻炖鸡吗 电压力锅无水炖鸡 孕妇可以吃天麻炖鸡吗 哪些人不能吃天麻炖鸡 铁锅炖大鹅 炖大鹅 炖鹅 东北铁锅炖大鹅 炖大鹅怎么做好吃