给你一个整数数组
coins,表示不同面额的硬币;以及一个整数amount,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回-1。
你可以认为每种硬币的数量是无限的。
样例
Example
示例 1:
输入: coins =[1, 2, 5], amount =11
输出:3
解释: 11 = 5 + 5 + 1示例 2:
输入: coins =[2], amount =3
输出: -1示例 3:
输入: coins =[1], amount = 0
输出: 0提示:
1 <= coins.length <= 121 <= coins[i] <= 231 - 10 <= amount <= 104
思路
完全背包问题。
设为前个硬币凑成金额所需的最少的硬币个数,得
然后可以滚动数组优化得
初始化条件为,。如果结果为则无法凑出。
答案
C++
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int big_num = 99999999;
int dp[10010];
for(int i = 1; i <= amount; i++)
dp[i] = big_num;
for(int coin : coins)
for(int j = coin; i <= amount; i++)
dp[j] = std::min(dp[j], dp[j - coin] + 1);
if(dp[amount] == big_num)
return -1;
return dp[amount];
}
};