题目来源 Leetcode, 感谢🙇,如果内容对您有帮助,欢迎点赞。
题目描述
- 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
- 输入: coins = [1, 2, 5], amount = 11
- 输出: 3
- 解释: 11 = 5 + 5 + 1
示例 2:
- 输入: coins = [2], amount = 3
- 输出: -1
说明:
- 你可以认为每种硬币的数量是无限的。
完整代码
class Solution {
public:
int ans = INT_MAX;
void dfs(vector<int>& coins, int rem, int index, int cnt) {
if (index < 0) return;
for (int count = rem / coins[index]; count >= 0; --count)
{
int t_rem = rem - count * coins[index];
if (t_rem == 0)
{
ans = min(ans, cnt + count);
break;
}
else if (cnt + count + 1 >= ans)
break;
dfs(coins, t_rem, index-1, cnt + count);
}
}
int coinChange(vector<int>& coins, int amount) {
sort(coins.begin(), coins.end());
dfs(coins, amount, coins.size()-1, 0);
return ans == INT_MAX ? -1 : ans;
}
};
执行结果
题目来源 Leetcode, 感谢🙇,如果内容对您有帮助,欢迎点赞。