给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:
输入: coins = [2], amount = 3
输出: -1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/coin-change
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
刘汝佳蓝书P60页例题
-
d
p
[
i
]
dp[i]
dp[i]表示凑出
i
~i~
i 需要的
最少
硬币 - 转移方程 : d p [ i ] = m i n ( − ∞ , d p [ i − V j ] ) , V j 是 每 个 硬 币 的 值 dp[i]=min(-\infty,dp[i-V_j]),V_j是每个硬币的值 dp[i]=min(−∞,dp[i−Vj]),Vj是每个硬币的值
- 边界条件 : d p [ 0 ] = 0 dp[0]=0 dp[0]=0
#define MAXN (int(1e6))
int dp[MAXN];
#define INF (0x3f3f3f3f)
class Solution {
public:
int coinChange(vector<int>& a, int S) {
int n = a.size();
memset(dp, INF, sizeof(dp)); //初始化为正无穷
dp[0] = 0;
for(int i=0; i<=S; i++) {
for(int j=0; j<n; j++) {
if(i >= a[j])
dp[i] = min(dp[i], dp[i-a[j]]+1);
}
}
return dp[S]==INF ? -1 : dp[S];
}
};