草庐IT

深入剖析多重背包问题(上篇)

深入剖析多重背包问题(上篇)前言在前面的两篇文章当中,我们已经仔细的讨论了01背包问题和完全背包问题,在本篇文章当中将给大家介绍另外一种背包问题——多重背包问题,多重背包问题的物品数量介于01背包问题和完全背包问题之间,他的物品的数量是有限个!多重背包问题介绍有\(N\)种物品和一个容量是\(V\)的背包。第\(i\)种物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。注意:上面使用到的字符含义在本篇文章当中都一样。多重背包问题跟01背包和完全背包的区别都是在物品的可用次数上,01背包只能使用一次

深入剖析多重背包问题(上篇)

深入剖析多重背包问题(上篇)前言在前面的两篇文章当中,我们已经仔细的讨论了01背包问题和完全背包问题,在本篇文章当中将给大家介绍另外一种背包问题——多重背包问题,多重背包问题的物品数量介于01背包问题和完全背包问题之间,他的物品的数量是有限个!多重背包问题介绍有\(N\)种物品和一个容量是\(V\)的背包。第\(i\)种物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。注意:上面使用到的字符含义在本篇文章当中都一样。多重背包问题跟01背包和完全背包的区别都是在物品的可用次数上,01背包只能使用一次

17张图带你深度剖析 ArrayDeque(JDK双端队列)源码

ArrayDeque(JDK双端队列)源码深度剖析前言在本篇文章当中主要跟大家介绍JDK给我们提供的一种用数组实现的双端队列,在之前的文章LinkedList源码剖析当中我们已经介绍了一种双端队列,不过与ArrayDeque不同的是,LinkedList的双端队列使用双向链表实现的。双端队列整体分析我们通常所谈论到的队列都是一端进一端出,而双端队列的两端则都是可进可出。下面是双端队列的几个操作:数据从双端队列左侧进入。数据从双端队列右侧进入。数据从双端队列左侧弹出。数据从双端队列右侧弹出。而在ArrayDeque当中也给我们提供了对应的方法去实现,比如下面这个例子就是上图对应的代码操作:pub

17张图带你深度剖析 ArrayDeque(JDK双端队列)源码

ArrayDeque(JDK双端队列)源码深度剖析前言在本篇文章当中主要跟大家介绍JDK给我们提供的一种用数组实现的双端队列,在之前的文章LinkedList源码剖析当中我们已经介绍了一种双端队列,不过与ArrayDeque不同的是,LinkedList的双端队列使用双向链表实现的。双端队列整体分析我们通常所谈论到的队列都是一端进一端出,而双端队列的两端则都是可进可出。下面是双端队列的几个操作:数据从双端队列左侧进入。数据从双端队列右侧进入。数据从双端队列左侧弹出。数据从双端队列右侧弹出。而在ArrayDeque当中也给我们提供了对应的方法去实现,比如下面这个例子就是上图对应的代码操作:pub

深入剖析多重背包问题(下篇)

深入剖析多重背包问题(下篇)前言在前面的三篇文章当中,我们已经仔细的讨论了01背包问题和完全背包问题以及多重背包上篇,在本篇文章当中主要给大家介绍多重背包问题的一种优化方法——二进制优化多重背包,如果你还没有看过多重背包上篇,你需要先阅读多重背包上篇。多重背包问题介绍有\(N\)种物品和一个容量是\(V\)的背包。第\(i\)种物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。注意:上面使用到的字符含义在本篇文章当中都一样。多重背包问题跟01背包和完全背包的区别都是在物品的可用次数上,01背包只能

深入剖析多重背包问题(下篇)

深入剖析多重背包问题(下篇)前言在前面的三篇文章当中,我们已经仔细的讨论了01背包问题和完全背包问题以及多重背包上篇,在本篇文章当中主要给大家介绍多重背包问题的一种优化方法——二进制优化多重背包,如果你还没有看过多重背包上篇,你需要先阅读多重背包上篇。多重背包问题介绍有\(N\)种物品和一个容量是\(V\)的背包。第\(i\)种物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。注意:上面使用到的字符含义在本篇文章当中都一样。多重背包问题跟01背包和完全背包的区别都是在物品的可用次数上,01背包只能

深入剖析斐波拉契数列

深入剖析斐波拉契数列前言动态规划作为一种非常经典的一类算法,不仅在解决实际问题当中有很多实际的应用,同时通常也是面试的一个重点。本篇文章一步步剖析动态规划的基本原理,通过斐波拉契数列问题(优化时间复杂度从\(O(2^n)\)到O(n)再到O(log(n)))一步一步带你从最基本的原理弄懂动态规划。我们首先分析斐波拉契数列问题,然后在分析问题的时候慢慢的深入动态规划。斐波拉契数列斐波拉契数列的定义如下:\[F_0=0\]\[F_1=1\]\[F_n=F_{n-1}+F_{n-2}\]就是斐波那契数列由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。比如说在斐波拉契数列当中第一个数为0,第

深入剖析斐波拉契数列

深入剖析斐波拉契数列前言动态规划作为一种非常经典的一类算法,不仅在解决实际问题当中有很多实际的应用,同时通常也是面试的一个重点。本篇文章一步步剖析动态规划的基本原理,通过斐波拉契数列问题(优化时间复杂度从\(O(2^n)\)到O(n)再到O(log(n)))一步一步带你从最基本的原理弄懂动态规划。我们首先分析斐波拉契数列问题,然后在分析问题的时候慢慢的深入动态规划。斐波拉契数列斐波拉契数列的定义如下:\[F_0=0\]\[F_1=1\]\[F_n=F_{n-1}+F_{n-2}\]就是斐波那契数列由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。比如说在斐波拉契数列当中第一个数为0,第

HashMap源码深度剖析,手把手带你分析每一行代码,包会!!!

HashMap源码深度剖析,手把手带你分析每一行代码!在前面的两篇文章哈希表的原理和200行代码带你写自己的HashMap(如果你阅读这篇文章感觉有点困难,可以先阅读这两篇文章)当中我们仔细谈到了哈希表的原理并且自己动手使用线性探测法实现了我们自己的哈希表MyHashMap。在本篇文章当中我们将仔细分析JDK当中HashMap的源代码。首先我们需要了解的是一个容器最重要的四个功能增删改查,而我们也是主要根据这四个功能进行展开一步一步的剖析HashMap的源代码。在正式进行源码分析之前,先提一下:在JDK当中实现的HashMap解决哈希冲突的办法是使用链地址法,而我们自己之前在文章200行代码带

HashMap源码深度剖析,手把手带你分析每一行代码,包会!!!

HashMap源码深度剖析,手把手带你分析每一行代码!在前面的两篇文章哈希表的原理和200行代码带你写自己的HashMap(如果你阅读这篇文章感觉有点困难,可以先阅读这两篇文章)当中我们仔细谈到了哈希表的原理并且自己动手使用线性探测法实现了我们自己的哈希表MyHashMap。在本篇文章当中我们将仔细分析JDK当中HashMap的源代码。首先我们需要了解的是一个容器最重要的四个功能增删改查,而我们也是主要根据这四个功能进行展开一步一步的剖析HashMap的源代码。在正式进行源码分析之前,先提一下:在JDK当中实现的HashMap解决哈希冲突的办法是使用链地址法,而我们自己之前在文章200行代码带