leetcode 518. 零钱兑换 II

news2024/11/19 19:21:37

        本题是背包问题系列的完全背包问题,和0-1背包唯一的区别就在于物品是可以重复选取的。 经过之前背包问题的拷打,本题也是一遍AC了。 接下来将给出二维和一维两种做法。

二维dp数组做法: 

        本题的背包大小即为题中给出的总金额:amount。物品即为硬币数组:coins。 需要求出不同硬币组合填满背包的情况种数。 我的解题步骤如下:

  • 设定二维dp数组,dp[i][j]的含义为:当背包大小为j时,coins[0]—coins[i]中的元素填满背包的方法个数。
  • 初始化二维dp数组的行和列。第一列全初始化为1,因为当背包大小为0时,此时不选取硬币即可填满背包。 第一行需要判断一下:如果用若干个coins[0]可以填满背包,则初始化为1,反之则初始化为0。
  • 接下来遍历物品和背包。需要先判断背包能否装下新的硬币。不能装下新硬币:则使用旧dp数组的值,即dp[i][j] = dp[i-1][j]。  能装下新硬币:在不使用新硬币的方法种数基础上,加上使用新硬币的方法种数。 即dp[i][j] = dp[i-1][j] + dp[i][j-coins[i]]。 这里有个细节:dp[i][j-coins[i]],这里dp第一个维度使用的是i而不是i-1,因为本题的物品可以重复选取,所以是i。 如果是0-1背包问题,物品不能重复选取,则应该填i-1。

         下面给出我画的草稿图以供参考:

 代码如下:

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        vector<vector<int>> dp(coins.size(),vector<int>(amount+1));
        //初始化dp数组的列
        for(int i=0; i<coins.size(); i++)
        {
            dp[i][0] = 1;
        }
        //初始化dp数组的行
        for(int i=1; i<=amount; i++)
        {
            //大小为i的背包能用若干个coins[0]的硬币装满
            if(i % coins[0] == 0) dp[0][i] = 1;
            else dp[0][i] = 0;
        }
        //遍历硬币
        for(int i=1; i<coins.size(); i++)
        {
            //遍历背包
            for(int j=1; j<=amount; j++)
            {
                //当前背包大小装不下新硬币,即不使用新硬币。
                if(j < coins[i]) dp[i][j] = dp[i-1][j];
                //使用新硬币和不使用新硬币的总和。 由于硬币可以重复使用,所以是dp[i][j-coins[i]]而不是dp[i-1][j-coins[i]]
                else dp[i][j] = dp[i-1][j] + dp[i][j-coins[i]];
            }
        }
        return dp[coins.size()-1][amount];
    }
};

一维dp数组做法: 

        代码如下:

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        vector<int> dp(amount+1 , 0);
        dp[0] = 1;
        //遍历硬币
        for(int i=0; i<coins.size(); i++)
        {
            //遍历背包
            for(int j=coins[i]; j<=amount; j++)
            {
                dp[j] += dp[j-coins[i]]; 
            }
        }
        return dp[amount];
    }
};

        ps:遍历背包的时候 j 是从coins[i]开始正序遍历,而之前0-1背包问题是从末尾开始倒序遍历,原因就是本题的物品可以重复选取,所以正序遍历,而0-1背包的物品无法重复选取,所以倒序遍历。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

与微软Office抗衡,两大巨头布局,打造新办公软件,再上新台阶

办公软件是我们日常工作中不可或缺的工具。 除了广为人知的微软Office套件外&#xff0c;近几年来&#xff0c;中国市场有许多优秀的国产办公软件抢眼登场&#xff0c;这些软件在提高工作效率、简化工作流程方面发挥着重要作用。 简单介绍几款值得知道的国产办公软件&#xff…

【学习FreeRTOS】第9章——FreeRTOS任务调度

1.开启任务调度器 vTaskStartScheduler() 作用&#xff1a;用于启动任务调度器&#xff0c;任务调度器启动后&#xff0c; FreeRTOS 便会开始进行任务调度【动态创建任务为例】 创建空闲任务如果使能软件定时器&#xff0c;则创建定时器任务关闭中断&#xff0c;防止调度器开…

99%的Python用户都不知道的f-string隐秘技巧

f-string想必很多Python用户都基础性的使用过&#xff0c;作为Python3.6版本开始引入的特性&#xff0c;通过它我们可以更加方便地向字符串中嵌入自定义内容&#xff0c;但f-string真正蕴含的功能远比大多数用户知道的要丰富&#xff0c;今天我们就来一起get它们~ 「最基础用法…

JVS开源基础框架:平台基本信息介绍

JVS是面向软件开发团队可以快速实现应用的基础开发脚手架&#xff0c;主要定位于企业信息化通用底座&#xff0c;采用微服务分布式框架&#xff0c;提供丰富的基础功能&#xff0c;集成众多业务引擎&#xff0c;它灵活性强&#xff0c;界面化配置对开发者友好&#xff0c;底层容…

MySQL性能分析之慢查询日志查看

一、背景 MySQL的慢查询日志是MySQL提供的一种日志记录,他用来记录在MySQL中响应的时间超过阈值的语句,具体指运行时间超过long_query_time(默认是10秒)值的SQL,会被记录到慢查询日志中。 慢查询日志一般用于性能分析时开启,收集慢SQL然后通过explain进行全面分析,一…

GPU Dissolve(GPU 消散)学习GPU Instancing

一&#xff1a;摘要 通过制作一个模型GPU消散效果来学习GPU Instancing 也就是实例化。 目标效果是杨超大佬文章《GPU shatter》里面的消散效果如图&#xff1a; Tags&#xff1a;模型顶点分裂(Mesh Vertex Splitting)&#xff0c; 实例化绘制(GPU Instancing Drawing)&#x…

【100天精通python】Day36:GUI界面编程_高级功能操作和示例

专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12375510.html 一、GUI 高级功能 1 自定义主题和样式 自定义主题和样式可以让你的GUI应用程序在外观方面更加出色。在使用Tkinter时&#xff0c;你可以使用ttkthemes库来应用不同的主题和样式。…

一文搞懂Spring是如何解决Bean循环依赖的?

一.什么是Bean循环依赖 循环依赖是指Bean对象循环引用&#xff0c;是两个或多个Bean之间相互持有对方的引用&#xff0c;循环依赖有2中表现形式 第一种相互依赖&#xff0c;就是A依赖B&#xff0c;B又依赖A 第二种是自我依赖&#xff0c;就是A依赖自己形成自我依赖 对象引用…

上山取石&#xff0c;下江取锦。诗人秋浦啸傲&#xff0c;新津樵唱。江南山水秀美&#xff0c;水乡文化流长。而水&#xff0c;则是这些山水风景的灵魂所在。 水&#xff0c;雨露滋润万物生长的泉源。 它潺潺流淌于山间溪涧&#xff0c;涓涓细流化成了青山的眼泪。水顺势而下&a…

Unity如何制作声音控制条(控制音量大小)

一&#xff1a;UGUI制作 1. 首先在【层级】下面创建UI里面的Slider组件。设置好它对应的宽度和高度。 2.调整Slider滑动条的填充颜色。一般声音颜色我黄色&#xff0c;所以我们也调成黄色。 我们尝试滑动Slider里面的value。 a.滑动前。 b.滑动一半。 c.滑动完。 从以上滑动va…

Openai中的tokens怎么估计

大规模语言模型&#xff08;LLM&#xff09;的出现给自然语言处理领域带来了变革的可能性&#xff0c;Openai开放了chatgpt的API&#xff0c;方便了开发人员使用LLM的推理能力&#xff0c;注册时赠送5美元的使用额度&#xff0c;有效期3个月。 如果想便捷的使用chatgpt的API&a…

判断推理

六哥爱学习呀 产品经理 不是说我努力学习我就一定可以通过考试&#xff0c;所以是推不出&#xff0c;类似数学中充分必要性 8 回复 发布于 2019-08-07 16:28 官方解析&#xff1a; 当丙的范围足够大时&#xff0c;可能与甲相交或完全包含甲&#xff0c;在此情况下&#xff0c;有…

【数据结构】顺序队列模拟实现

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

ansible 修改远程主机nginx配置文件

安装ansible brew install ansible 或者 pip3 install ansible 添加远程主机 设置秘钥 mac登录远程主机 ssh -p 5700 root192.168.123.211 ssh localhost #设置双机信任 ssh-kyegen -t rsa #设置主机两边的ssh配置文件 vi /etc/ssh/sshd_config/ PermitRootL…

C++写文件,直接写入结构体

C写文件&#xff0c;直接写入结构体 以前写文件都是写入字符串或者二进制再或者就是一些配置文件&#xff0c;今天介绍一下直接写入结构体&#xff0c;可以在软件参数较多的时候直接进行读写&#xff0c;直接将整个结构体写入和读取&#xff0c;看代码&#xff1a; #include&…

除了ping你用过traceroute吗

一、检查两个计算机间的网络是否通 在检查两个机器的网络通不通&#xff0c;我们经常使用的命令是ping 但是当ping不通时&#xff0c;我们就不知道网络是哪里不通了&#xff0c;只能找网管排查。 这里介绍一个检查网络工具 traceroute 二 、TraceRoute是什么 TraceRoute的中文…

驱动 - 20230816

练习 1.编写LED灯的驱动&#xff0c;可以控制三个灯&#xff0c;应用程序中编写控制灯的逻辑&#xff0c;要使用自动创建设备节点机制 驱动头文件 ledHead.h #ifndef __HEAD_H__ #define __HEAD_H__#define PHY_GPIOE_MODER 0X50006000 #define PHY_GPIOE_ODR 0X50006014 #d…

toB营销如何从品牌营销转向获客营销?

“解构纷享新营销&#xff0c;赋能用户新增长”&#xff0c;这是2023年下半年&#xff0c;纷享销客践行“以客户成功定义成功”价值观&#xff0c;针对企业用户市场营销领域的全国巡回研讨会&#xff0c;希望把纷享销客在成长路上经历的、收获的经验、踩过的“坑”与用户共享&a…

Postman如何做接口测试:什么?postman 还可以做压力测试?

我们都知道&#xff0c; postman 是一款很好用的接口测试工具。不过 postman 还可以做简单的压力测试&#xff0c;而且步骤只需要 2 步。 首先&#xff0c;打开 postman, 编写接口的请求参数。 然后&#xff0c;点击右下方的 runner 运行器&#xff0c;把需要测试的接口拖动到…

序列模型和循环网络

Sequence Modeling and Recurrent Networks Sequence modeling tasks 在以往的模型中&#xff0c;各个输入之间是独立分布的 x ( i ) x^{(i)} x(i) 之间是相互独立的&#xff0c;同样输出 y ( i ) y^{(i)} y(i)之间也是相互独立的。 但是在序列模型中&#xff0c;输入输出是…