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

完全背包理论基础

完全背包看起来复杂不少,但其代码和0-1背包几乎没啥差别,就只改变了一个背包的遍历顺序:

基于0-1背包的滚动数组实现,将 j 的遍历顺序改为从左到右(此时物品会被重复使用) 

完全背包的重点是如何使一个物品能够被重复使用。理解其实现前先回顾一下0-1背包是怎么让一个物品只使用一次的:

                        背包问题的递推公式:dp[j] = max(dp[j], dp[j - value[i]] + value[i])

这个递推公式中,每次更新使用dp[j]原先的值与其左边的值来更新dp[j]

如果 j 从右向左遍历,更新完dp[j]后继续向左遍历。对于每个dp[j],只有一次与value[i]接触的机会。这就保证了每个物品只取一次。

如果将 j 的遍历顺序改为从左向右呢?dp[j]需要用到其左边的值(设其为dp[j - n])来进行更新,此时需要取用一次物品 i ,而dp[i - n]也是由其左边的值更新来的,这里又可能会需要取用一次物品 i 。所以对于dp[i]来说就能够取用两次物品 i。随着逐渐向右遍历,dp[j]还可能使用更多次物品 i ,这就实现了物品 i 的复数次使用。


 518.零钱兑换 II

这题理解了完全背包后还是比较简单的,没有脑筋急转弯,就是一道完全背包+组合的题,写法与昨天的494目标和差不多

int change(int amount, vector<int>& coins) {vector<int> dp(amount + 1, 0);dp[0] = 1;for (int i = 0; i < coins.size(); ++i) {// 完全背包在遍历滚动数组时,j的顺序是从左向右的for (int j = coins[i]; j <= amount; ++j) {dp[j] += dp[j - coins[i]];}}return dp[amount];
}

377.组合总和 Ⅳ

这题看题好像和上一题差不多,但再仔细看就能发现,这题是排列,而上一题是组合

看似复杂了不少,其实只要调换一下物品和背包的遍历嵌套关系就行:

· 对于组合问题,应该先遍历物品再遍历背包,这样物品是一类一类往背包里放的,物品i+1只能在物品i后放入背包
· 对于排列问题,应该先遍历背包再遍历物品,这样物品i+1能在物品i之前放入背包

(这题有一个恶心人的测试用例,所以在递推时需要多一步判断)

int combinationSum4(vector<int>& nums, int target) {vector<long> dp(target + 1, 0);dp[0] = 1;for (int j = 0; j <= target; ++j) {for (int i = 0; i < nums.size(); ++i) {if (nums[i] > j)continue;// 防止个别测试用例溢出if(dp[j] < INT_MAX - dp[j - nums[i]])dp[j] += dp[j - nums[i]];	}}return dp[target];
}

总结

无论是完全背包与0-1背包的差异,还是排列问题与组合问题的差异,最好的理解方法就是动手模拟一下dp数组的更新过程,模拟实际的物品是怎么一个个放入背包的。

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

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

相关文章

5,水平百叶窗和垂直百叶窗

将宽度设置为若干份&#xff0c;开始显示时若干个起始线&#xff0c;每个起始线间隔相同的距离。显示过程中&#xff0c;每次各个起始线同时向下&#xff08;或向右&#xff09;显示一行&#xff08;或一列&#xff09;图像&#xff0c;直到图像显示完毕。 void CMy1_showbitm…

哪个牌子的电视盒子好用?2024超强电视盒子排名

最近很多朋友问我电视盒子的相关问题&#xff0c;就目前来说&#xff0c;电视盒子的地位依然是不可取代的。我近来要发布的测评内容是哪个牌子的电视盒子好用&#xff0c;耗时两周进行对比后整理了电视盒子排名&#xff0c;看看哪些电视盒子是最值得入手的吧。 NO.1——泰捷新品…

react-组件基础

1.目标 能够使用函数创建组件 能够使用class创建组件 能够给React元素绑定事件 能够使用state和setState() 能够处理事件中的this指向问题 能够使用受控组件方式处理表单 2.目录 React组件介绍 React组件的两种创建方式 React事件处理 有状态组件和无状态组件 组件中的state…

我在代码随想录|写代码Day27 | 贪心算法 | 122.买卖股票的最佳时机 II,55. 跳跃游戏, 45.跳跃游戏 II

&#x1f525;博客介绍&#xff1a; 27dCnc &#x1f3a5;系列专栏&#xff1a; <<数据结构与算法>> << 算法入门>> << C项目>> &#x1f3a5; 当前专栏: <<数据结构与算法>> 专题 : 数据结构帮助小白快速入门算法 &…

【文献管理】zotero插件5——在word中引用参考文献文献样式修改

文章目录 word快速引用参考文献参考文献样式修改GB7714-修改etal word快速引用参考文献 参考文献样式修改 GB7714-修改etal

获取URL中的参数

在现实生活中&#xff0c;我们处处使用URL&#xff0c;但是&#xff0c;对于其中的数据&#xff08;参数&#xff09;&#xff0c;我们该如何获取呢&#xff1f;&#xff1f;这就值得我们深思了&#xff01; 在本文&#xff0c;笔者主要向大家讲解用Java语言的Spring Boot项目…

WEB服务器-Tomcat(黑马学习笔记)

简介 服务器概述 服务器硬件 ● 指的也是计算机&#xff0c;只不过服务器要比我们日常使用的计算机大很多。 服务器&#xff0c;也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求&#xff0c;并进行处理&#xff0c;因此一般来说服务器应具备承担服务并且保障…

华为OD机试真题-最长子字符串的长度(一)-2023年OD统一考试(C卷)---Python3--开源

题目&#xff1a; 考察内容&#xff1a; 思路转化&#xff1a;求出o字母出现偶次&#xff08;o的索引&#xff09;&#xff1b;环形–双倍字母&#xff1b; 方法1&#xff1a;循环变量双倍字母&#xff08;保证环线&#xff09;&#xff0c;记录最大偶次&#xff0c;如果是&a…

【Flink精讲】Flink单机安装步骤

Flink单机安装步骤 获取Flink安装包&#xff1a;Index of /flink 解压缩&#xff1a;tar -zxvf flink-1.17.2-bin-scala_2.12.tgz 修改配置文件&#xff1a;conf/flink-conf.yaml 启动命令&#xff1a;./bin/start-cluster.sh 终止命令&#xff1a;./bin/stop-cluster.s…

【视频编码\VVC】帧间预测编码基础知识

帧间预测编码概述 基本原理 利用时间相关性&#xff0c;使用邻近已编码图像像素值预测当前图像的像素值&#xff0c;能够有效去除时域冗余。目前的视频编码标准中&#xff0c;帧间预测都采用了基于块的运动补偿技术。 运动估计&#xff08;ME&#xff09;&#xff1a;当前图…

2024程序员进阶宝典,字节跳动+腾讯+华为+小米+阿里面试题分享

1、拓宽知识面 兴趣来了挡也挡不住&#xff01;从最初开始学习编程&#xff0c;从ASP到ASP.net,JS,Winform,Java,C,PHP,Python,都是自学&#xff01; 不过这里要说一下&#xff0c;如果没有一两门编程语言比较熟悉的情况下&#xff0c;最好还是不要自学&#xff1b;入门是最难…

Linux系统——Nginx拓展

目录 一、重写功能——rewrite 1.if 1.1 if 2. return 2.1状态码301和302的区别 301 302 3. set 4. break 5. rewrite 5.1 rewrite flag使用 5.2 flag说明 5.3举例 5.3.1访问 bj 跳转 beijing 5.3.2举例——break 5.3.3 http 转 https 5.3.4 break 与 last …

要在Javascript中实现表格新增行功能,且添加元素,增删操作

起始表格元素&#xff1a; <!-- table>(thead>tr>th*6)(tbody>tr>td*6) --><div class"container"><table id"myTable"><caption><h3>员工信息管理系统</h3></caption><thead><tr>&…

Python爬虫获取淘宝商品详情页数据|实现自动化采集商品信息

要实现自动化采集淘宝商品详情页数据&#xff0c;可以使用Python的第三方库如requests和BeautifulSoup。以下是一个简单的示例&#xff1a; Taobao.item_get-获得淘宝商品详情数据接口返回值说明 1.请求方式:HTTP POST &#xff1b;复制Taobaoapi2014获取APISDK文件。 2.请求…

【kubernetes】关于k8s集群的声明式管理资源

目录 一、声明式管理方法 二、资源配置清单管理 1、导出资源配置清单 2、修改资源配置清单并应用 2.1离线修改 2.2在线修改 三、通过资源配置清单创建资源对象 获取K8S资源配置清单文件模板&#xff1f; 关于配置清单常见的字段 方案一&#xff1a;手写yaml配置文件 …

swagger-ui.html报错404,解决办法

swagger-ui.html报错404,解决办法&#xff01;现在后端开发项目中&#xff0c;为了节省时间&#xff0c;使用swagger插件&#xff0c;可以方便的快捷生成接口文档。但是如果你在请求前端页面路径比如&#xff1a;http://127.0.0.1:7777/swagger-ui.html。找不到。那是因为你的配…

ROS-Ubuntu 版本相关

ROS-Ubuntu 版本相关&#xff1a;安装指引 年代ROS1版本Ubuntu 版本2014Indigo14.042016Kinetic16.042018Melodic18.042020Noetic20.04 & 22.04 ROS2兼顾了工业使用上的问题。 年代ROS2版本Ubuntu 版本2022Humble20.04 & 22.042023Iron16.04 相关参考&#xff1a; […

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

单片机复位按键电路、唤醒按键电路

目录 单片机复位按键 外部手动复位 单片机复位按键电路 复位按键电路1 复位按键电路2 单片机唤醒按键 单片机唤醒按键电路 单片机复位按键 单片机复位&#xff1a;简单来说&#xff0c;复位引脚就是有复位信号&#xff0c;就是从头开始执行程序 本质&#xff1a;就是靠…

ui设计:利用即使设计设计出漂亮样式

目录 一、基本操作 二、具体介绍 6-1 填充图片 6-2 填充色 6-3 图标 右边栏基础设置 右边栏导出​编辑 一、基本操作 二、具体介绍 6-1 填充图片 选择其一图片填充 6-2 填充色 6-3 图标 右边栏基础设置 右边栏导出