代码随想录算法训练营第四十六天 | 完全背包理论基础、518. 零钱兑换 II、377. 组合总和 Ⅳ

完全背包理论基础

视频讲解: https://www.bilibili.com/video/BV1uK411o7c9

https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.html 

完全和01背包的区别:

物品的数量是无数个,因此在01背包中遍历背包时,正序遍历即可,这样就是用的这一行已经修改过的数据,因此正序,而倒序遍历时,左边都是上一行的状态,因此只添加了一次,是01背包

两层for循环可以颠倒(仅限纯完全背包),排列和组合是不一样的

遍历物品在外层循环,遍历背包容量在内层循环,状态如图:

 遍历背包容量在外层循环,遍历物品在内层循环,状态如图:

因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。 只要保证下标j之前的dp[j]都是经过计算的就可以了,先行还是先列都是会先算出之前的数据

518. 零钱兑换 II

视频讲解: 动态规划之完全背包,装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II_哔哩哔哩_bilibili

代码随想录

解题思路

1. dp[j]  装满容量为j的背包,有dp[j]种方法

2.dp[j] += dp[ j- coins[i] ]

3. dp[0] = 1

4.遍历顺序

先遍历物品,再遍历背包,物品2再物品1后面,因此只会出现1,2这种情况,是组合

先背包,再物品,背包的容量增大时,每个物品又会被重新遍历,因此可能会出现2放入之后再放1的情况,也就是排列

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];}
};
  • 时间复杂度: O(mn),其中 m 是amount,n 是 coins 的长度
  • 空间复杂度: O(m)

 377. 组合总和 Ⅳ

视频讲解: 动态规划之完全背包,装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV_哔哩哔哩_bilibili

代码随想录

解题思路

与上题没有变化,但是先遍历背包时,要多加一个判断,就是放入的物体要比背包容量小

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] ])   //放入的物品要比背包容量小,并且dpj不会超过int最大值dp[j] += dp[ j-nums[i] ];}}return dp[target];}
};

时间复杂度: O(target * n),其中 n 为 nums 的长度

空间复杂度: O(target)

收获

01背包和完全背包的区别

两层for循环的循序与排列或者组合有关,并注意排列需要添加额外的判断条件 

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

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

相关文章

通俗易懂->哈希表详解

目录 一、什么是哈希表&#xff1f; 1.1哈希表长什么样&#xff1f; 1.2为什么会有哈希表&#xff1f; 1.3哈希表的特点 1.3.1 取余法、线性探测 1.3.2 映射 1.3.3负载因子 1.4哈希桶 1.5闲散列与开散列 1.6总结 二、设计hash表 1、哈希表的设计 1&#xff09;插入…

Nginx实战:日志打印自定义请求头

nginx的日志可以打印很多内容&#xff0c;但是有时候自定义的请求头该怎么打印呢&#xff1f;像下面这种场景&#xff1a; 其实很简单&#xff0c;设置日志打印格式log_format的时候&#xff0c;自定义的请求头用 【$http_自定义请求头名】 的格式就可以打印出来 例如你的自定义…

如何掌握Spring事件发布和监听机制?

在软件设计和开发过程中&#xff0c;事件驱动是一种非常主流的架构模式&#xff0c;它的基本组成见下图&#xff0c;可以看到存在一个事件中心&#xff0c;而各个服务可以执行事件发布、订阅和消费等基本过程。 事件驱动架构代表的是一种架构设计风格&#xff0c;实现方法和工具…

[图解]企业应用架构模式2024新译本讲解05-表模块2

1 00:00:00,970 --> 00:00:03,440 接下来&#xff0c;我们就来看案例了 2 00:00:03,690 --> 00:00:09,260 案例跟上一次事务脚本案例是一样的 3 00:00:11,210 --> 00:00:13,130 也是收入确认这个案例 4 00:00:14,460 --> 00:00:15,580 这是表结构 5 00:00:15,7…

WHAT - Typescript 中 structural-type-system 结构类型系统

目录 一、结构类型系统与名义类型系统二、结构类型系统的基本概念三、泛型和结构类型系统四、类型别名和接口的兼容性五、总结 一、结构类型系统与名义类型系统 TypeScript 中的结构类型系统&#xff08;Structural Type System&#xff09;是 TypeScript 的核心特性之一&…

解决uniapp里的onNavigationBarSearchInputClicked不生效

如何在uniapp里使用onNavigationBarSearchInputClicked。 1、在page.json里配置 "pages": [{"path": "pages/index/index","style": {"navigationBarTitleText": "首页","navigationStyle": "cu…

【Android】手动下载gradle插件包,解决gradle插件包下载不全问题。

问题描述 拉取别人的项目时&#xff0c;因为网络问题gradle插件包一直下载不全&#xff0c;一直build。 解决方案&#xff1a; 打开gradle>wrapper文件下gradle-wrapper.properties&#xff0c;查看需要下载gradle-7.2-bin.zip。 distributionBaseGRADLE_USER_HOME distr…

cmd窗口输出内容乱码问题

出现这样的问题是因为编码格式和解码格式不一样导致的&#xff0c;cmd窗口的默认解码格式为GBK&#xff0c;如想修改cmd默认编码格式可以按照下面步骤操作&#xff1a;打开cmd窗口输入&#xff1a;chcp 65001 65001指的是utf-8编码如果不清楚编码对应的 页面编码是是多少&#…

国内外知名的低代码开发平台下载地址

以下是国内外几款低代码开发平台的列表&#xff0c;包含了下载地址、适应操作系统、是否可以独立部署、优点、缺点以及是否包含流程引擎的信息。 平台名称 下载地址 适应操作系统 是否可以独立部署 优点 缺点 是否包含流程引擎 国内平台 阿里云宜搭 阿里云官网 跨平台…

文件批量重新命名

实用 如果你想忽略原文件的后缀&#xff0c;将所有文件&#xff08;除了 .py 文件&#xff09;都重命名为以 .jpg 结尾&#xff0c;并且使用序号来命名&#xff0c;你可以使用以下脚本&#xff1a; # renamefile.py import os# 定义原始目录和起始序号 original_directory &q…

C++操纵符用法

C中的操纵符&#xff08;Manipulators&#xff09;是用于格式化输入输出的特殊工具。它们可以在输出流中控制各种格式&#xff0c;如设置字段宽度、精度、填充字符等。以下是一些常用的操纵符及其用法&#xff1a; setw(int width): 设置字段宽度为width个字符。 cout <<…

访问github加速方法续集dev-sidecar

访问github加速方法续集dev-sidecar dev-sidecar 重要提醒 ------------------------------重要提醒1--------------------------------- 注意&#xff1a;由于electron无法监听windows的关机事件&#xff0c;开着ds情况下直接重启电脑&#xff0c;会导致无法上网&#xff0c…

【网络层】IP地址基础 与 子网掩码

文章目录 IP地址基础IP地址概念IP地址分类公网地址和私网地址 子网掩码子网掩码作用默认子网掩码网络地址、主机地址、广播地址 IP地址基础 IP地址概念 IP地址&#xff1a;IP Address 在网络中&#xff0c;通信节点都需要有一个IP地址 IP地址以点分十进制表示&#xff0c;有…

建设人工智能平台,主流GPU卡选型分析

国内外主流GPU卡性能分析&#xff01;2024&#xff01; 大模型兴起助推算力需求激增 2024年&#xff0c;深度学习与人工智能技术飞速跃进&#xff0c;Transformer、GPT-3等大模型在自然语言处理、图像识别、语音合成等领域大放异彩&#xff0c;开启AI新纪元。其庞大的参数与数…

Matlab操作Excel筛选指定数据的对应数据

Matlab中在表格中寻找指定汉字&#xff0c;并返回其所在行数&#xff0c; 将该行数的另一列提取出来。 目录 一、前言 二、直接在命令行输出 三、保存筛选数据excel 一、前言 源数据excel&#xff1a; 指定汉子&#xff1a;买&#xff0c;得到下面数据&#xff1a; 二、直接…

微信小程序埋点监听方案

场景&#xff1a;运营小程序&#xff0c;需要根据系统访问情况来做决策时。 后台&#xff1a;开发可配置监听页面路径&#xff0c;参数&#xff0c;事件名称等&#xff0c;类似以下格式&#xff0c;进行json保存。 组装数据接口返回给前端缓存到本地&#xff0c;然后进行校验编…

2024华为OD机试真题-机器人搬砖-C++(C卷D卷)

题目描述 机器人搬砖,一共有N堆砖存放在N个不同的仓库中,第i堆砖中有bricks[i]块砖头, 要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格, 机器人一个小时中只能在一个仓库中搬砖,机器人的能量格每小时补充一次且能量格只在这一个小时有效,为使得机器人损…

Vue3 自定义Hooks函数的封装

1、如何理解vue3中的自定义hooks 在Vue 3中&#xff0c;自定义hooks允许开发者封装和重用逻辑代码。自定义hooks是使用Composition API时创建的函数&#xff0c;这些函数可以包含任意的组合逻辑&#xff0c;并且可以在多个组件之间共享。 自定义hooks通常遵循这样的命名约定&…

MyBatis延迟加载缓存分页逆向工程

文章目录 延迟加载概述步骤 缓存一级缓存介绍原理 二级缓存介绍 设置缓存对象策略原理开启步骤属性解释是否使用一级缓存 分页插件使用步骤 逆向工程介绍搭建使用增删修改查 延迟加载 概述 延迟加载本身是依赖于多表查询的 延迟加载中返回值要选择resultMap返回的结果一定是D…

数学建模 —— 插值与拟合(1)

一、matlab画图 1.1 plot&#xff08;二维图形&#xff09; plot(x) —— 缺省自变量绘图格式 plot(x,y) —— 基本格式&#xff0c;以y(x)的函数关系作出直角坐标图&#xff0c;如果y为nm的矩阵&#xff0c;则以x为自变量&#xff0c;作出m条曲线 plot(x1,y1,x2,y2,…,xn,…