Copy Example 1:
Input: coins = [1,2,5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
Example 2:
Input: coins = [2], amount = 3
Output: -1
Example 3:
Input: coins = [1], amount = 0
Output: 0
Example 4:
Input: coins = [1], amount = 1
Output: 1
Example 5:
Input: coins = [1], amount = 2
Output: 2
Copy class Solution
{
public:
int res = INT_MAX;
void countCoins(vector<int> &coins, int amount, int pos, vector<int> &cc)
{
if (pos >= coins.size())
{
return;
}
if (amount == 0)
{
int count = 0;
for (int i = 0; i < cc.size(); i++)
{
count += cc[i];
}
res = min(res, count);
}
if (amount < 0)
{
return;
}
countCoins(coins, amount, pos + 1, cc);
cc[pos]++;
countCoins(coins, amount - coins[pos], pos, cc);
cc[pos]--;
return;
}
int coinChange(vector<int> &coins, int amount)
{
vector<int> cc(coins.size(), 0);
countCoins(coins, amount, 0, cc);
if (res == INT_MAX)
{
return -1;
}
return res;
}
};
Copy class Solution
{
public:
int coinChange(vector<int> &coins, int amount)
{
int n = coins.size();
vector<vector<int>> dp(n + 1, vector<int>(amount + 1, 0));
for (int i = 0; i <= n; i++)
{
dp[i][0] = 0;
}
for (int i = 0; i <= amount; i++)
{
dp[0][i] = amount + 1;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= amount; j++)
{
if (coins[i - 1] <= j)
{
int exclude = dp[i - 1][j];
int include = 1 + dp[i][j - coins[i - 1]];
dp[i][j] = min(exclude, include);
}
else
{
dp[i][j] = dp[i - 1][j];
}
}
}
if (dp[n][amount] == amount + 1)
{
return -1;
}
return dp[n][amount];
}
};
Solution : (DP Optimized space)
Copy class Solution
{
public:
int coinChange(vector<int> &coins, int amount)
{
vector<int> v(amount + 1, INT_MAX);
v[0] = 0;
for (int i = 1; i <= amount; i++)
{
for (int j = 0; j < coins.size(); j++)
{
if (coins[j] <= i)
{
int res = v[i - coins[j]];
if (res != INT_MAX && res + 1 < v[i])
{
v[i] = res + 1;
}
}
}
}
if (v[amount] == INT_MAX)
{
return -1;
}
return v[amount];
}
};