【Leetcode刷题笔记】LCR 103. 零钱兑换
2023-12-26 17:45:51
LCR 103. 零钱兑换
解题思路
- base case: 目标金额amount=0的时候,算法返回0 不需要任何硬币就可以凑出目标金额
- 确定状态:原问题和子问题中会变化的变量。由于硬币数量无限,硬币的面额也是题目给定的,只有目标金额会不断向base case 靠近,所以唯一的状态就是目标金额amount
- 确定选择,也就是导致状态产生变化的行为,每次选择一枚硬币,相当于减少了目标金额
- dp函数/数组的定义:dp数组的元素就是状态转移中会变化的量,也就是说到的状态-目标金额,dp函数的返回值就是题目需要计算的量—硬币数量
class Solution {
int[] memo;// 备忘录数组
public int coinChange(int[] coins, int amount) {
// 初始化备忘录数组
memo = new int[amount + 1];
// 将备忘录数组中每一个子问题的解初始化一个不可能的结果
Arrays.fill(memo,-666);
return dp(coins,amount);// dp
}
int dp(int[] coins,int amount){
// 首先写出递推的条件
if(amount == 0){
return 0;
}
if(amount < 0){
return -1;// 那就是无解的情况
}
// 首先查找子问题的解有没有
if(memo[amount] != -666){
return memo[amount];
}
int res = Integer.MAX_VALUE;
// 如果子问题没有 遍历所有硬币
for(int coin:coins){
// 遍历子问题的解
int sub = dp(coins,amount - coin);
// 更新子问题的解
if(sub == -1){
continue;
}
// 取出最小值
res = Math.min(res,sub + 1);// 子问题 + 1
}
// 将计算结果存入备忘录中
memo[amount] = (res == Integer.MAX_VALUE) ? -1:res;
return memo[amount];
}
}
文章来源:https://blog.csdn.net/qq_44653420/article/details/135226310
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!