【算法练习Day37】零钱兑换 II组合总和 Ⅳ

news2024/12/25 10:04:45

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 零钱兑换 II
  • 组合总和 Ⅳ
  • 总结:

这两道题是对于完全背包题型的另一个维度,都是求解给定背包容量求装满背包最多有几种方法的题目。两道题十分相像,但在遍历顺序上却又有着极其微妙的差别。

零钱兑换 II

518. 零钱兑换 II - 力扣(LeetCode)

在这里插入图片描述

零钱兑换II是完全背包中的装满背包有几种方法的题,而我们以前做过的目标和很是相像,那个需要限定物品只有一个而这道题的区别仅仅是不限定物品的数量。

dp数组的含义:还是根据动规的五部曲来分析,首先dp数组的含义一定是容量为j时候,可以有多少种方法填满背包。

递推公式:递推公式与目标和那道题是一样的。dp【j】+=dp【j-nums【i】】虽然那期已经讲过了,递推公式是如何得到了,但是在本期我想对此再作进一步的补充说明。我们还是以j=5来举例,实际上可以将该递推公式想像成dp【5】=dp【5-nums【0】】+dp【5-nums【1】】+dp【5-nums【2】】+…这样展开来看是不是就更容易理解了,就是先假定我们一定会加入该物品,然后我们再看背包容量j减掉当前物品的重量后,还有几种方法。因为dp【j】所代表的就是当前容量几种方法,所以减掉物品重量后,我们可以用到之前求得的dp来累加起来。背包容量每扩大一点,所对应的填满方法个数,都需要用它之前的背包容量的方法来累加计算得到。

dp数组的初始化:我们之前就说果dp【0】=1,这是因为我们累加如果第一个数就是0,那么加到最后也还是0,其他非0的部分初始化为0,这是因为递推公式的缘故,是累加起来的,如果非0部分初始化不为0,累加时候会不准。换句话来说,累加取决的应该是当前容量之前的各个容量和,而并非受当前容量本身所影响。

遍历顺序:遍历顺序由于是完全背包模型的缘故,需要将背包正序遍历,以装入重复物品。至于是先遍历背包还是先遍历物品也是有讲究的。这道题我们通过测试用例可以看得出来,很明显测试用例都是组合,而非排列,也就是说我们求得的是无顺序的,{1,2}和{2,1}应该看成一种情况!我们这个时候应该先遍历物品后遍历背包,先锁定物品再装入背包这样的好处是,如果数组是{1,2}那么2一定会出现在1的后面被添加,而不是出现在前面,因为先遍历物品的缘故。如果是相反的先遍历背包,那么很有可能会在背包里同时出现{1,2}和{2,1}的情况。我认为这与递推公式也有一定的关系,如果是先遍历背包的话,那么锁定背包容量去遍历物品,当前的循环就可能出现以下情况,当背包容量为3,物品为{1,2},遍历到第一个物品,背包装物品1后根据递推公式是再加等于dp【3-1】,遍历到第2个物品时候,根据递推公式是再加等于dp【3-2】这就造成了我上面说的重复添加,也就是排列的情况了!这相当于二维数组中的同一层在一次填数时候,连续更新了背包!如果是先遍历物品再遍历背包的情况,那么当前里层循环只有装入当前遍历的物品和不装入两种情况,当前并不能加入其它物品,也就不会出现排列的情况,那有人说那你第二次加入物品呢?比如第一次加入1,第二次加入2呢?那不是和之前一样了吗?其实不然,因为第二次加入物品2,那在二维数组中相当于下一层填数了,并不影响上一层,别忘了一维数组是滚动数组。一个是同一层的连续更新,一个是一层一层的更新,是有区别的。

这是我对遍历顺序的理解,我们也可以简记为:

求组合,先遍历物品,求排列,先遍历背包

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=0;j<=amount;j++){
                if(j>=coins[i])
                dp[j]+=dp[j-coins[i]];
            }
        }
        return dp[amount];
    }
};

组合总和 Ⅳ

377. 组合总和 Ⅳ - 力扣(LeetCode)

在这里插入图片描述

这道题实际上的思路和上一道题完全一样,只不过这道题是求排列的。这里就不进行动规分析了!

我们只需要将遍历顺序改成我上面说的规律,使for循环的两层上下颠倒即可。

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        vector<int>dp(target+1,0);
        dp[0]=1;
        for(int j=0;j<=target;j++){
            for(int i=0;i<nums.size();i++){
                if(j>=nums[i]&&dp[j]<INT_MAX-dp[j-nums[i]])
                dp[j]+=dp[j-nums[i]];
            }
        }
        return dp[target];
    }
};

仍有一点需要注意,就是我们在判断部分还要写上dp[j]<INT_MAX-dp[j-nums[i]],这是因为测试用例中有出现两个数相加超过int承载范围的数字。但是我们不能直接写成dp【j】+dp【j-nums【i】】<INT_MAX,因为两个数相加太大它也会报错,所以我们要将一个数转移到等号右边,使它做差,这样就可以避免报错了!

总结:

今天我们完成了零钱兑换 II、组合总和 Ⅳ两道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

Redis入门04-消息通知

目录 Redis中的消息通知 命令行操作 Redis中的管道 Redis中的消息通知 Redis可以用作消息队列的中间件&#xff0c;它提供了一种轻量级、高性能的消息传递机制&#xff0c;适用于实时通信、任务队列、事件处理等各种应用。以下是有关如何使用Redis作为消息队列的一些重要信…

中国人民大学与加拿大女王大学金融硕士——人生是旷野,不是一条轨道

在这个瞬息万变的时代&#xff0c;我们每个人都像是一颗流星&#xff0c;在宇宙中独自燃烧。我们每个人都有自己的梦想&#xff0c;自己的追求&#xff0c;自己的道路。然而&#xff0c;很多时候&#xff0c;我们却发现自己被现实的轨道所束缚&#xff0c;无法自由地追求自己的…

记一次并发问题 Synchronized 失效

记一次并发问题 Synchronized 失效 场景&#xff1a;为避免信息提交重复&#xff0c;给事务方法增加了synchronized修饰符&#xff0c;实际场景中仍然无法完全避免重复&#xff0c;原因是因为在第一个线程执行完synchronized代码段后&#xff0c;此时spring还未完成事务提交&a…

macOS 安装brew

参考链接&#xff1a; https://mirrors4.tuna.tsinghua.edu.cn/help/homebrew/ https://www.yii666.com/blog/429332.html 安装中科大源的&#xff1a; https://zhuanlan.zhihu.com/p/470873649

Langchain-Chatchat项目:4.2-P-Tuning v2使用的数据集

本文主要介绍P-tuning-v2论文中的5种任务&#xff0c;分别为Glue任务、NER任务、QA任务、SRL任务、SuperGlue任务&#xff0c;重点介绍了下每种任务使用的数据集。 一.Glue任务   GLUE&#xff08;General Language Understanding Evaluation&#xff09;是纽约大学、华盛顿…

直播界很火的无线领夹麦克风快充方案 Type-C接口 PD快充+无线麦克风可同时进行

当前市场上流行一款很火的直播神器&#xff0c;无线领夹麦克风&#xff08;MIC&#xff09;&#xff0c;应用于网红直播&#xff0c;网课教学&#xff0c;采访录音&#xff0c;视频录制&#xff0c;视频会议等等场景。 麦克风对我们来说并不陌生&#xff0c;而且品类有很多。随…

app逆向入门之车智赢

声明&#xff1a;本文仅限学习交流使用&#xff0c;禁止用于非法用途、商业活动等。否则后果自负。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01;本教程也没有专门针对某个网站而编写&#xff0c;单纯的技术研究 目录 案例分析技术依赖参数分析效果展示代码分享…

LabVIEW开发自动批次称重和卸料系统

LabVIEW开发自动批次称重和卸料系统 对自动批次称重系统具明显的优势&#xff0c;例如确保批次完整性&#xff0c;确保批次质量和一致性&#xff0c;允许更好的批次跟踪&#xff0c;并且报告生成范围更广&#xff0c;上层接口的规定更容易。称重配料系统应根据配料方法、输送机…

APP攻防--ADB基础

进入app包 先使用 adb devices查看链接状态 手机连接成功的 adb shell 获取到手机的一个shell 此时想进入app包时没有权限的&#xff0c;APP包一般在data/data/下。没有执行权限&#xff0c;如图 Permission denied 权限被拒绝 此时需要手机root&#xff0c;root后输入 su …

DbUtils + Druid 实现 JDBC 操作 --- 附BaseDao

文章目录 Apache-DBUtils实现CRUD操作1 Apache-DBUtils简介2 主要API的使用2.1 DbUtils2.2 QueryRunner类2.3 ResultSetHandler接口及实现类 3 JDBCUtil 工具类编写3.1 导包3.2 编写配置文件3.3 编写代码 4 BaseDao 编写 Apache-DBUtils实现CRUD操作 1 Apache-DBUtils简介 com…

2-爬虫-代理池搭建、代理池使用(搭建django后端测试)、爬取某视频网站、爬取某视频网站、bs4介绍和遍历文档树

1 代理池搭建 2 代理池使用 2.1 搭建django后端测试 3 爬取某视频网站 4爬取某视频网站 5 bs4介绍和遍历文档树 1 代理池搭建 # ip代理-每个设备都会有自己的IP地址-电脑有ip地址---》访问一个网站---》访问太频繁---》封ip-收费&#xff1a;靠谱稳定--提供api-免费&#xff…

NOIP2023模拟10联测31 涂鸦

题目大意 有一面由 n m n\times m nm个格子组成的墙&#xff0c;每个格子要么是黑色&#xff0c;要么是白色。你每次将会进行这样的操作&#xff1a;等概率随机选择一个位置 ( x , y ) (x,y) (x,y)和一个颜色 c c c&#xff08;黑色或白色&#xff09;&#xff0c;&#xff0…

Portraiture4.1.2最新中文汉化版

提起PS后期修图人像美白磨皮&#xff0c;大家会想到各种磨皮工具&#xff0c;其中Portraiture这款磨皮效率超高&#xff0c;是99%摄影师的必备插件&#xff0c;一秒磨皮&#xff0c;无卡顿&#xff0c;效果好&#xff01;人像摄影师人均一款&#xff0c;磨皮质感非常好&#xf…

ER图:改变你数据库设计流程的神器!

在现今数据驱动的世界中&#xff0c;数据库设计扮演了至关重要的角色。为了实现有效且准确的数据存储和检索&#xff0c;企业们开始倾向于采用实体关系图&#xff08;Entity-Relationship Diagram&#xff0c;简称ER图&#xff09;来优化他们的数据库设计流程。本文将带你走进E…

Rust编程基础之条件表达式和循环

1.if表达式 if 表达式允许根据条件执行不同的代码分支, 以下代码是一个典型的使用if表达式的例子: fn main() {let number 3; ​if number < 5 {println!("condition was true");} else {println!("condition was false");} } 所有的 if 表达式都以…

win10 + vs2017 + cmake3.17编译OSG-3.4.1

参考教程&#xff1a;https://blog.csdn.net/bailang_zhizun/article/details/120992244 1. 下载与解压 2. 修改configure 1&#xff09;Ungrouped Entries -- 》ACTUAL_3RDPARTY_DIR: 设置为&#xff1a; D:/Depend_3rd_party/OSG341/3rdParty 2&#xff09; Ungrouped E…

免费的 AI 视频生成工具 Moonvalley 厉害了!Moonvalley 怎么用(保姆级教程)

一、Moonvalley 介绍 Moonvalley&#xff0c;号称地表最强的 AI 视频生成工具&#xff0c;到底有多厉害&#xff1f;今天一起来看一下~ 这是 Moonvalley 官网的介绍&#xff1a; Moonvalley 是一个开创性的新型文本到视频的生成式 AI 模型。用简单的文本即可创建出惊人的电影和…

分享一个自己写的免费的微信聊天记录提取软件 2023.11.03

有什么办法可以导出与某个人的微信聊天记录&#xff1f; 只想导出与某个微信好友的聊天记录&#xff0c;有办法做到吗&#xff1f;导出所有的话&#xff0c;文件太大了&#xff0c;只想导出与其中一个人的&#xff0c;求大神教。 我的需求和上面这个人的比较类似&#xff0c;因…

2023辽宁省数学建模竞赛选题建议及AB题思路

大家好呀&#xff0c;今天早上2023年辽宁省大学生数学建模竞赛开赛&#xff0c;在这里给大家带来初步的选题建议及思路。 注意&#xff0c;本文只是比较简略的图文版讲解&#xff0c;完整的视频版讲解请移步&#xff1a; 2023辽宁省数学建模竞赛选题建议及初步思路_哔哩哔哩_…

【面经】讲一下synchronized锁升级的过程

synchronized锁升级是指从偏向锁到轻量级锁&#xff0c;再到重量级锁的过程。 当线程获取synchronized对象时&#xff0c;首先会进行偏向锁的尝试。 如果偏向锁没有竞争&#xff0c;线程将永远不需要同步。 但是&#xff0c;如果偏向锁竞争失败&#xff0c;将升级到轻量级锁。…