C++ day44完全背包问题 零钱兑换Ⅱ 组合总和Ⅳ

完全背包:一个物品可以使用无数次,将01背包中倒序遍历背包变成正序遍历背包

遍历顺序:完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的!

先遍历物品,后遍历背包可以;先遍历背包,后遍历物品也可以,因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的,只要保证下标j之前的dp[j]都是经过计算的就可以了。

纯完全背包问题题目链接:完全背包

题目:有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。

代码1(先正序遍历物品,后正序遍历背包)

void full_backbag(vector<int>weight,vector<int> value,int bagweight){//初始化dp数组,定义dp数组vector<int> dp(bagweight+1,0);//递推。先正序遍历物品,后正序遍历背包for(int i=0;i<weight.size();i++){for(int j=weight[i];j<=bagweight;j++){dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);}}cout << dp[bagweight] << endl;
}

代码2(先正序遍历背包,后正序遍历物品)

void full_backbag(vector<int>weight,vector<int> value,int bagweight){//初始化dp数组,定义dp数组vector<int> dp(bagweight+1,0);//递推,先正序遍历背包,后正序遍历物品for(int j=0;j<=bagweight;j++){for(int i=0;i<weight.size();i++){if(j>=weight[i]) dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);}}cout << dp[bagweight] << endl;
}

可以出一道面试题了,就是纯完全背包,要求先用二维dp数组实现,然后再用一维dp数组实现,最后再问,两个for循环的先后是否可以颠倒?为什么?

题目2:518  零钱兑换Ⅱ

题目链接:零钱兑换Ⅱ

对题目的理解

整数数组coins表示不同面额的硬币,整数amount表示总金额

返回可以凑成总金额的硬币组合有多少种,如果无法凑出,则返回0,假设每一种面额的硬币有无限个  数据保证结果是带符号32位整数,注意求的是组合,不是排列

coins中至少有1个硬币,最多有300个硬币;硬币的面额至少是1,最大是5000,且记录的coins中的数值互不相同   总金额在0~5000之间(闭区间)

每个物品可以使用无限次,是完全背包问题,但是本题和纯完全背包不一样纯完全背包是凑成背包最大价值是多少,而本题是要求凑成总金额的物品组合个数!

动规五部曲

1)明确dp数组及下标的含义

dp[j]:装满容量为j的背包有dp[j]种方法  ,最终求解dp[amount]

2)递推公式

dp[j]+=dp[j-coins[i]]由目标和那道题得到

3)dp数组初始化

dp[0]=1 根据递推公式得到,如果dp[0] = 0 的话,后面所有推导出来的值都是0了。其他 非零下标对应的dp[j]初始化为0,这样累加的时候才不会影响结果

4)遍历顺序(难点)

纯完全背包求得装满背包的最大价值是多少,和凑成总和的元素有没有顺序没关系,即:有顺序也行,没有顺序也行!能凑成总和就行

本题要求凑成总和的组合数,元素之间明确要求没有顺序,那么两个for循环就有顺序请求了

!!!先正序遍历物品,后正序遍历背包(组合)

这个是从前往后考虑每一个硬币,前面的硬币在之后不会重复,后面的硬币只在后面出现,所以没有重复的组合,所以这个是针对组合的,考虑容量的时候,后面只会考虑在前面硬币的基础上增加后面的硬币,而不会在后面的硬币不足的情况下,增加前面的硬币

!!!先正序遍历背包,后正序遍历物品(排列)

上述这个圈出来的3求解的时候,多计算了一次,因为前面计算coins[0]=1时,容量为3那个已经计算了{1,1,1}和{1,2}的组合,而下面在coins[1]=2,容量为3时,又计算了一次{2,1}的组合,所以这个是针对排列的

5)打印dp数组

代码

class Solution {
public:int change(int amount, vector<int>& coins) {//定义并初始化dp数组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)

题目3:377  组合总和Ⅳ

题目链接:组合总和Ⅳ

对题目的理解

整数数组nums由不同整数组成,找出nums中总和为target的元素的组合个数(nums中的元素是可以重复使用的)但是本题求的是集合的个数,是一种排列(nums[i]>=1,nums数组中至少有一个元素)

本题元素可以重复使用,完全背包问题

如果本题要把排列都列出来的话,只能使用回溯算法爆搜

动规五部曲

1)dp数组及下标的含义

总和为j的背包有dp[j]种排列   最终求的是dp[target]

2)   递推公式

dp[j] += dp[j-nums[i]]

3)dp数组初始化

根据递推公式的累加,可推出dp[0]=1 ,不然,初始化为0的话,dp数组全为0; 递推公式是累加的,所以其余非零下标的dp[j]均初始化为0,以免覆盖计算的dp结果

4)遍历顺序

由于题目要求的是排列,所以先遍历背包后遍历物品

5)打印dp数组

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {//定义并初始化dp数组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];}
};
  • 时间复杂度: O(target * n),其中 n 为 nums 的长度
  • 空间复杂度: O(target)

!!!C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num],不然会报错!!!

求装满背包有几种方法,递归公式都是一样的,没有什么差别,但关键在于遍历顺序!

扩展

(面试)本题可延伸至进化版的爬楼梯:

一步可以爬几个台阶,相当于组合总和Ⅳ的nums数组中每一个物品[1,2,3,....,m],爬到楼顶是n,n就是target,求爬到楼顶有多少种方法(强调元素的顺序),即装满背包有多少种方法  ,代码和组合总和IV一样  完全背包

假如一步可以爬m个台阶,爬到楼顶有多少种方法?求的是排列数,还是组合数?

遍历顺序可不可以颠倒,如果颠倒,求的是什么场景,没有颠倒,求的又是什么场景?

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

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

相关文章

win10 下 mvn install 报错:编码GBK不可映射字符

问题背景 由于jenkins需要部署不同的项目&#xff0c;需要使用不同的jdk版本&#xff0c;所以需要配置单独的settings.xml&#xff0c;使用指定的jdk版本进行编译&#xff0c;这里需要单独的maven设置&#xff0c;在配置完后进行mvn的install的时候&#xff0c;由于存在中文注释…

Maven——Maven使用基础

1、安装目录分析 1.1、环境变量MAVEN_HOME 环境变量指向Maven的安装目录&#xff0c;如下图所示&#xff1a; 下面看一下该目录的结构和内容&#xff1a; bin&#xff1a;该目录包含了mvn运行的脚本&#xff0c;这些脚本用来配置Java命令&#xff0c;准备好classpath和相关…

Cytoscape软件下载、安装、插件学习[基础教程]

写在前面 今天分享的内容是自己遇到问题后&#xff0c;咨询社群里面的同学&#xff0c;帮忙解决的总结。 关于Cytoscape&#xff0c;对于做组学或生物信息学的同学基本是陌生的&#xff0c;可能有的同学用这个软件作图是非常溜的&#xff0c;做出来的网络图也是十分的好看&am…

【海思SS528 | VDEC】MPP媒体处理软件V5.0 | VDEC的使用总结

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

距离“全自动”漏洞挖掘又近了一步!腾讯安全大数据实验室论文入选ACM CCS 2023

计算机领域国际权威学术顶会ACM CCS 2023于11月26日在丹麦哥本哈根开幕。腾讯安全大数据实验室团队论文《Hopper: Interpretative Fuzzing for Libraries》被大会收录&#xff0c;昨天&#xff0c;实验室研究员谢雨轩受邀出席大会进行主题分享。 该论文提出了解释性模糊测试&a…

UCSC基因组浏览器用法

UCSC基因组浏览器用法 UCSC基因组浏览器是一个强大的在线工具&#xff0c;主要用于查看和分析多种生物的基因组数据。这个浏览器最初是由加利福尼亚大学圣克鲁兹分校的生物信息学家和计算生物学家开发的&#xff0c;旨在为科研人员提供一个易于访问和使用的界面&#xff0c;用于…

Java数据结构之《合并线性表》问题

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等偏下的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我…

freertos任务调度机制深度分析(以RISC-V架构为例)

1、前言 本文是以RISC-V架构为例进行讲解&#xff0c;在汇编代码层面和ARM架构不一样&#xff0c;但是整体框架是一样的侧重任务调度底层机制讲解&#xff0c;讲解代码只保留了基本功能&#xff0c;可配置的功能基本都已经删除本文是以可抢占式调度机制进行讲解RISC-V架构只支持…

【ZEDSLAM】Ubuntu18.04系统ZED 2i双目相机SDK安装、联合标定、SLAM测试

0.设备、环境和说明 笔记本电脑i5-8300H、GTX 1060、32GRAM 因为后面要测试Vins-Fusion和ORB-SLAM3&#xff0c;所以推荐安装Ubuntu 18.04&#xff08;或者Ubuntu 20.04&#xff09; ROS 1&#xff08;不建议用比Ubuntu18更低的版本&#xff09; ROS一键安装命令&#xff1a;…

智能监控平台/视频共享融合系统EasyCVR接入RTSP协议视频流无法播放原因是什么?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

网络入门---网络编程预备知识

目录标题 ifconfigip地址和mac地址的区别端口号pid和端口号UDP和TCP的初步了解网络字节序socket套接字 ifconfig 通过指令ifconfig便可以查看到两个网络接口&#xff1a; 我们当前使用的是一个linux服务器并是一个终端设备&#xff0c;所以他只需要一个接口用来入网即可&…

JVM

图来自JavaGuide 程序计数器 程序计数器是线程私有的&#xff0c;每个线程一份&#xff0c;是线程安全的&#xff1b;内部保存的字节码的行号&#xff0c;用于记录正在执行的字节码指令的地址。 java堆 java堆是线程共享的区域&#xff08;线程不安全&#xff09;&#xff…

ECRS生产工时分析软件:工业效率提升的隐形引擎

降本增效往往是企业开工规划的第一步。那到底降什么本&#xff0c;增什么效呢&#xff0c;对于很多企业来说&#xff0c;都是从采购成本入手&#xff0c;结果采购成本是降下来了&#xff0c;但是整体品质却下降了。实际上&#xff0c;要降本增效&#xff0c;优化现场管理才是企…

leetcode 611. 有效三角形的个数(优质解法)

代码&#xff1a; class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int lengthnums.length;int n0; //三元组的个数//c 代表三角形最长的那条边for (int clength-1;c>2;c--){int left0;int rightc-1;while (left<right){if(nums[left]nums[r…

【JavaEE初阶】 HTTP响应报文

文章目录 &#x1f332;序言&#x1f38d;200 OK&#x1f340;404 Not Found&#x1f384;403 Forbidden&#x1f334;405 Method Not Allowed&#x1f38b;500 Internal Server Error&#x1f333;504 Gateway Timeout&#x1f332;302 Move temporarily&#x1f38d;301 Move…

序列号管理

序列号管理&#xff0c;将从以下方面进行学习和阐述 WHY 为什么需要序列号&#xff0c;有什么作用 HOW sap如何进行管理序列号 WHEN 什么情况下适合进行序列号管理 1、 什么是序列号 首先简单介绍一个序列号是什么东西&#xff0c;我们使用的手机、电脑或者大家…

Spring Framework远程代码执行漏洞 CVE-2022-22965 漏洞复现

Spring Framework远程代码执行漏洞 CVE-2022-22965 漏洞复现和相关利用工具 名称: Spring Framework 远程命令执行漏洞 描述: Spring core是Spring系列产品中用来负责发现、创建并处理bean之间的关系的一个工具包&#xff0c;是一个包含Spring框架基本的核心工具包&#xff0…

【SparkSQL】基础入门(重点:SparkSQL和Hive的异同、SparkSQL数据抽象)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Spark SQL的定义、特点、发展历史、与hive的区别、数据抽象、SparkSession对象。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一…

远程工具无法连接VMware虚拟机 (Network error: Connection timed out)

windowr输入&#xff1a;services.msc ①检查window相关的Vmmare服务是否开启&#xff1a; 确保上面这个几个启动类型是自动&#xff0c;状态是正在运行。 ②排查虚拟网卡是否禁用&#xff1a; 设置->网络->更改适配器选项&#xff1a; ③检查虚拟网络编辑器以及虚拟机…

Java数据结构之《栈实现括号匹配的检验》问题

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我写完…