力扣打卡:322. 零钱兑换
解题思路
动态规划的问题,最重要的写出暴力递归的方法
- 暴力递归没有记录结果的数组
- 递归的写法是:定义一个函数,这个函数就可以的结果,不要去想能不能得到结果
- 定义的函数就可以得到结果,然后用子问题的结果结合当前的操作去解决总的问题
- 最后返回需要的结果
- 最重要的是转移方程,也就是怎么连接子问题和当前所在的操作对象
代码
class Solution {
public int coinChange(int[] coins, int amount) {
int[] memo = new int[amount+1];
Arrays.fill(memo, -1000);
return planB(memo, coins, amount);
}
public int planA(int[] coins, int amount){
if(amount<0) return -1;
if(amount==0) return 0;
int res = Integer.MAX_VALUE;
for(int x: coins){
int subRes = planA(coins, amount-x);
if(subRes == -1) continue;
res = Math.min(res, subRes+1);
}
return res==Integer.MAX_VALUE ? -1 : res;
}
public int planB(int[] memo, int[] coins, int amount){
if(amount<0) return -1;
if(amount==0) return 0;
if(memo[amount] != -1000) return memo[amount];
int res = Integer.MAX_VALUE;
for(int x: coins){
int subRes = planB(memo, coins, amount-x);
if(subRes==-1) continue;
res = Math.min(res, subRes+1);
}
res = res== Integer.MAX_VALUE ? -1 : res;
memo[amount] = res;
return memo[amount];
}
}
|