注:本题是需要装满的完全背包问题
Leetcode 322
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.Credits:
Special thanks to @jianchao.li.fighter for adding this problem and >creating all test cases.
题意:
- 现提供不同硬币值域与需找的零钱amount,要求找到一种搭配,使得硬币的总值等于amount且数量最少。如果找到搭配的,则返回使用的硬币数量;如果找不到搭配,则返回-1
- 每种硬币都可以重复使用,且它们的和应当等于amount
思路:
- 该题本质上是背包问题,更细致的说,是需要填满的完全背包
- 首先它的状态是amount
- 其次它的状态转移方程是v[i] = Min(v[i], v[i-coins[j]]+1)
代码
class Solution {
public:
int Min(int a, int b) {
return (a < b) ? a : b;
}
int coinChange(vector<int>& coins, int amount) {
vector<int> vec(amount+1, amount+1);
vec[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < coins.size(); j++) {
if (i >= coins[j])
vec[i] = Min(vec[i], vec[i-coins[j]]+1);
}
}
return (vec[amount] >= amount+1) ? -1 : vec[amount];
}
};
以上内容皆为本人观点,欢迎大家批评和指导,我们一起探讨!