凡科网站建设样品图,和wordpress类似的源码,十大互联网培训机构,临汾建设局官方网站题目
给你一个整数数组 coins 表示不同面额的硬币#xff0c;另给一个整数 amount 表示总金额。
请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额#xff0c;返回 0 。
假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整…题目
给你一个整数数组 coins 表示不同面额的硬币另给一个整数 amount 表示总金额。
请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额返回 0 。
假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整数。
示例 1
输入amount 5, coins [1, 2, 5] 输出4 解释有四种方式可以凑成总金额 55 5221 52111 511111 示例 2
输入amount 3, coins [2] 输出0 解释只用面额 2 的硬币不能凑成总金额 3 。 示例 3
输入amount 10, coins [10] 输出1
提示
1 coins.length 300 1 coins[i] 5000 coins 中的所有值 互不相同 0 amount 5000
题解
记忆化搜索
class Solution {private int[] coins;private int[][] cache;public int change(int amount, int[] coins) {this.coins coins;int n coins.length;cache new int[n][amount 1];for (int i 0; i n; i) {Arrays.fill(cache[i],-1);}return dfs(n - 1, amount);}public int dfs(int i, int c) {if (i 0) {return c 0 ? 1 : 0;}if (cache[i][c] ! -1) {return cache[i][c];}if (c coins[i]) {return cache[i][c] dfs(i - 1, c);}return cache[i][c] dfs(i - 1, c) dfs(i, c - coins[i]);}
}1:1递推
class Solution {public int change(int amount, int[] coins) {int n coins.length;int[][] f new int[n 1][amount 1];f[0][0] 1;for (int i 0; i n; i) {for (int c 0; c amount; c) {if (c coins[i]) {f[i 1][c] f[i][c];} else {f[i 1][c] f[i][c] f[i 1][c - coins[i]]; }}}return f[n][amount];}
}空间优化
class Solution {public int change(int amount, int[] coins) {int n coins.length;int[] f new int[amount 1];f[0] 1;for (int x : coins) {for (int c x; c amount; c) {f[c] f[c - x];}}return f[amount];}
}