当前位置: 首页 > article >正文

Leetcode322.零钱兑换(HOT100)

链接

代码:

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1,amount+1);//要兑换amount元硬币,我们就算是全选择1元的硬币,也不过是amount个,所以初始化amount+1(超过最坏答案即可
        dp[0] = 0;//要兑换0面值硬币需要硬币个数为0
        for(int i = 1;i<=amount;i++){
            for(int j = 0;j<coins.size();j++){
                if(i-coins[j]>=0)
                    dp[i] = min(dp[i],dp[i-coins[j]]+1);
            }
        }
        if(dp[amount]==amount+1)//如果这个位置的值与初始化的相同,那么说明,这里的值没别更新过,说明解不存在
            return -1;
        else
            return dp[amount];
    }
};

题解:

要解决这个问题,我们得模拟一下人类看到这个问题是怎么解决的?
比如coins[] = 1 3 4 5   amount = 7

要兑换7,我们可以先选一个1,这样我们的目标就变为兑换7-1也就是6了,要兑换6,我们继续选,比如选1,那么问题转为兑换6-1也就是5了,所以我们发现要求出来兑换amount,那么你得先把兑换amount-1,amount-2.........(一直到兑换0需要0个硬币)求出来,从而得到兑换amount。

所以问题转为填表:兑换0需要0个硬币,那么兑换1需要多少硬币?兑换2需要?兑换...........兑换amount需要多少硬币?

所以我们开一个amount+1长的数组,往进填值。

我们还发现:兑换1需要多少硬币这个子问题,我们不能随便选硬币,比如你选择了5面值,这显然错误,所以我们填表的时候要判断:你要兑换的硬币数减去选择的硬币面值<0则什么都不做,>=0才填表。


http://www.kler.cn/a/411666.html

相关文章:

  • 鸿蒙心路旅程:从实践到创新——开发者的深度技术分享
  • 【vue3实现微信小程序】从轮播图到公告栏的前端开发之旅
  • 为什么DDoS防御很贵?
  • Spring源码(十三):Spring全系列总结
  • 嵌入式的C/C++:深入理解 static、const 与 volatile 的用法与特点
  • 下载并安装Visual Studio 2017过程
  • 训练的decoder模型文本长度不一致,一般设置为多大合适,需要覆盖最长的文本长度么
  • Spring集成RabbitMQ
  • 【spark-spring boot】学习笔记
  • IDEA某个Impl下的引入的文件红色
  • mp4视频流推送的学习
  • IDEA插件CamelCase,快速转变命名格式
  • 《硬件架构的艺术》笔记(八):消抖技术
  • css:转换
  • SQL优化笔记--explain看执行计划--主要还是看用了哪些索引,所以你是否失效--分库分表的注意事项(未完)
  • C#中面试的常见问题008
  • 列表代码思路
  • 前端技术选型之uniapp
  • MySQL中char和varchar的区别详解
  • JavaWeb——请求响应(5/8)-请求:日期参数json参数(使用场景及封装类型、接收方式、在 Postman 中传递、在服务端接收)
  • Spring框架使用xml方式配置ThreadPoolTaskExecutor线程池,并且自定义线程工厂
  • jdk17-LongAddr 类increment()方法注释说明
  • c++中的lambda表达式!
  • 【H2O2|全栈】JS进阶知识(十一)axios入门
  • ChatGPT如何辅助academic writing?
  • 学习路之linux--多php版本下指定php版本执行命令