给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。
示例 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 <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104
使用记忆化搜索:
class Solution {
public int coinChange(int[] arr, int account) {
int[][] cache = new int[arr.length][account+1];
for (int i = 0; i < cache.length; i++) {
for (int j = 0; j < account+1; j++) {
cache[i][j] = -1;
}
}
int r = dfs(arr, 0, account, cache);
return r >= 99999 ? -1 : r;
}
public int dfs(int[] arr, int start, int rest, int[][] cache) {
if (rest < 0) {
return 999999;
}
if (rest == 0) {
return 0;
}
if (start >= arr.length) {
return 99999;
}
if (cache[start][rest] == -1) {
//选当前数字,不移动
int r1 = 1+dfs(arr, start , rest - arr[start], cache);
//不选当前数字,往后移动1位
int r2 = dfs(arr, start + 1, rest, cache);
int r = Math.min(r1, r2);
cache[start][rest] = r;
}
return cache[start][rest];
}
}
这篇博客介绍了如何运用记忆化搜索算法解决给定不同面额硬币找零的最小硬币个数问题。示例中展示了在不同情况下(如 coins=[1,2,5] 和 amount=11 或 coins=[2] 和 amount=3)的求解过程,通过递归函数实现,并利用二维数组缓存中间结果以提高效率。当无法凑成总金额时,返回 -1。

被折叠的 条评论
为什么被折叠?



