-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path322_coin_change.cpp
More file actions
72 lines (56 loc) · 1.67 KB
/
322_coin_change.cpp
File metadata and controls
72 lines (56 loc) · 1.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
LeetCode 322 - Coin Change
Difficulty: Medium
Problem:
You are given an integer array coins representing coins of different denominations and an
integer amount representing a total amount of money.
Return 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.
You may assume that you have an infinite number of each kind of coin.
Example 1:
Input: coins = [1,5,10], amount = 11
Output: 2
Explanation: 11 = 5 + 5 + 1
Example 2:
Input: coins = [2], amount = 3
Output: -1
Example 3:
Input: coins = [1], amount = 0
Output: 0
Constraints:
1 <= coins.length <= 12
1 <= coins[i] <= 2^31 - 1
0 <= amount <= 10^4
Time Complexity: O(amount * len(coins))
Space Complexity: O(amount)
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount + 1, INT_MAX);
dp[0] = 0;
for (int a = 1; a <= amount; a++) {
for (int coin : coins) {
if (a - coin >= 0 && dp[a - coin] != INT_MAX) {
dp[a] = min(dp[a], 1 + dp[a - coin]);
}
}
}
return dp[amount] == INT_MAX ? -1 : dp[amount];
}
};
int main() {
Solution solution;
vector<int> coins1 = {1, 5, 10};
cout << solution.coinChange(coins1, 11) << endl; // 2
vector<int> coins2 = {2};
cout << solution.coinChange(coins2, 3) << endl; // -1
vector<int> coins3 = {1};
cout << solution.coinChange(coins3, 0) << endl; // 0
return 0;
}