其实记忆化递归就是动态规划
leetcode零钱兑换
动态规划版本
import java.util.Arrays;
public class Solution {
public int coinChange(int[] coins, int amount) {
// 给 0 占位
int[] dp = new int[amount + 1];
// 注意:因为要比较的是最小值,这个不可能的值就得赋值成为一个较大的值
// 初始化
Arrays.fill(dp, amount + 1);
dp[0] = 0;
// 递推开始
for (int i = 1; i <= amount; i++) {
for (int coin : coins) {
if (i - coin >= 0 && dp[i - coin] != amount + 1) {
dp[i] = Math.min(dp[i], 1 + dp[i - coin]);
}
}
}
// 如果不能凑出,根据题意返回 -1
if (dp[amount] == amount + 1) {
dp[amount] = -1;
}
return dp[amount];
}
}
记忆化递归写法
public class Solution {
private int[] memo;
public int coinChange(int[] coins, int amount) {
memo = new int[amount + 1];
// 由于 -1 表示当前面值不能凑出,这里初始化为 -2 表示还未计算出来
Arrays.fill(memo