01背包,完全背包,多重背包,混合背包详解

【动态规划】背包问题(详细总结,很全) 暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(Dynamic Planning) 里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。二维dp数组01背包,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历一维dp数组01背包,只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。求组合数:外层遍历物品,内层遍历背包。 阅读详情

文章转载至:https://www.cnblogs.com/kuangbin/archive/2011/11/16/2250560.html

P01: 01背包问题

题目:

    有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。

基本思路:

    这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。

    用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:

f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

    这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。

优化空间复杂度:

    以上方法的时间和空间复杂度均为O(VN),其中时间复杂度应该已经不能再优化了,但空间复杂度却可以优化到O。

    先考虑上面讲的基本思路如何实现,肯定是有一个主循环i=1..N,每次算出来二维数组f[i][0..V]的所有值。那么,如果只用一个数组f[0..V],能不能保证第i次循环结束后f[v]中表示的就是我们定义的状态f[i][v]呢?f[i][v]是由f[i-1][v]和f[i-1][v-c[i]]两个子问题递推而来,能否保证在推f[i][v]时(也即在第i次主循环中推f[v]时)能够得到f[i-1][v]和f[i-1][v-c[i]]的值呢?事实上,这要求在每次主循环中我们以v=V..0的顺序推f[v],这样才能保证推f[v]时f[v-c[i]]保存的是状态f[i-1][v-c[i]]的值。伪代码如下:

for(i=1..N)
    for(v=V..0)
        f[v]=max{f[v],f[v-c[i]]+w[i]}

    其中的f[v]=max{f[v],f[v-c[i]]}一句恰就相当于我们的转移方程f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]},因为现在的f[v-c[i]]就相当于原来的f[i-1][v-c[i]]。如果将v的循环顺序从上面的逆序改成顺序的话,那么则成了f[i][v]由f[i][v-c[i]]推知,与本题意不符,但它却是另一个重要的背包问题P02最简捷的解决方案,故学习只用一维数组解01背包问题是十分必要的。

    事实上,使用一维数组解01背包的程序在后面会被多次用到,所以这里抽象出一个处理一件01背包中的物品过程,以后的代码中直接调用不加说明。

    过程ZeroOnePack,表示处理一件01背包中的物品,两个参数cost、weight分别表明这件物品的费用和价值。

procedure ZeroOnePack(cost,weight);
for(v=V..cost)
    f[v]=max{f[v],f[v-cost]+weight};

    注意这个过程里的处理与前面给出的伪代码有所不同。前面的示例程序写成v=V..0是为了在程序中体现每个状态都按照方程求解了,避免不必要的思维复杂度。而这里既然已经抽象成看作黑箱的过程了,就可以加入优化。费用为cost的物品不会影响状态f[0..cost-1],这是显然的。

    有了这个过程以后,01背包问题的伪代码就可以这样写:

for(i=1..N)
    ZeroOnePack(c[i],w[i]);

初始化的细节问题
    我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化的时候有所不同。

    如果是第一种问法,要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。

    如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。

    为什么呢?可以这样理解:初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为0的背包可能被价值为0的nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应该是-∞了。如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的价值为0,所以初始时状态的值也就全部为0了。

    这个小技巧完全可以推广到其它类型的背包问题,后面也就不再对进行状态转移之前的初始化进行讲解。

一个常数优化
    前面的伪代码中有 for v=V..1,可以将这个循环的下限进行改进。

    由于只需要最后f[v]的值,倒推前一个物品,其实只要知道f[v-w[n]]即可。以此类推,对以第j个背包,其实只需要知道到f[v-sum{w[j..n]}]即可,即代码中的

for(i=1..N)
    for(v=V..0)

可以改成

for(i=1..n)
    bound=max{V-sum{w[i..n]},c[i]}
    for(v=V..bound)

这对于V比较大时是有用的。

小结
01背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成01背包问题求解。故一定要仔细体会上面基本思路的得出方法,状态转移方程的意义,以及最后怎样优化的空间复杂度。

P02: 完全背包问题

题目
    有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的容量是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的容量总和不超过背包容量,且价值总和最大。

基本思路
    这个问题非常类似于01背包问题,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。如果仍然按照解01背包时的思路,令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程,像这样:

f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i],f[i-1][v] }(0<=k*c[i]<=v)

    这跟01背包问题一样有O(VN)个状态需要求解,但求解每个状态的时间已经不是常数了,求解状态f[i][v]的时间是O(v/c[i]),总的复杂度可以认为是O(V*Σ(V/c[i])),是比较大的。

    将01背包问题的基本思路加以改进,得到了这样一个清晰的方法。这说明01背包问题的方程的确是很重要,可以推及其它类型的背包问题。但我们还是试图改进这个复杂度。

一个简单有效的优化
     完全背包问题有一个很简单有效的优化,是这样的:若两件物品i、j满足c[i]<=c[j]且w[i]>=w[j],则将物品j去掉,不用考虑。这个优化的正确性显然:任何情况下都可将价值小费用高得j换成物美价廉的i,得到至少不会更差的方案。对于随机生成的数据,这个方法往往会大大减少物品的件数,从而加快速度。然而这个并不能改善最坏情况的复杂度,因为有可能特别设计的数据可以一件物品也去不掉。

    这个优化可以简单的O(N^2)地实现,一般都可以承受。另外,针对背包问题而言,比较不错的一种方法是:首先将容量大于V的物品去掉,然后使用类似计数排序的做法,计算出容量相同的物品中价值最高的是哪个(只要保留价值大的就行了,和上面的筛选一样),可以O(V+N)地完成这个优化。这个不太重要的过程就不给出伪代码了,希望你能独立思考写出伪代码或程序。

转化为01背包问题求解
    既然01背包问题是最基本的背包问题,那么我们可以考虑把完全背包问题转化为01背包问题来解。最简单的想法是,考虑到第i种物品最多选V/c[i]件,于是可以把第i种物品转化为V/c[i]件容量及价值均不变的物品,然后求解这个01背包问题。这样完全没有改进基本思路的时间复杂度,但这毕竟给了我们将完全背包问题转化为01背包问题的思路:将一种物品拆成多件物品。

更高效的转化方法是:把第i种物品拆成容量为c[i]*2^k、价值为w[i]*2^k的若干件物品,其中k满足c[i]*2^k<=V。这是二进制的思想,因为不管最优策略选几件第i种物品,总可以表示成若干个2^k件物品的和。这样把每种物品拆成O(log V/c[i])件物品,是一个很大的改进。

但我们有更优的O(VN)的算法。

O(VN)的算法
这个算法使用一维数组,先看伪代码:

for(i=1..N)
    for(v=0..V)
        f[v]=max{f[v],f[v+c[i]]+w[i]}

    你会发现,这个伪代码与P01的伪代码只有v的循环次序不同而已。为什么这样一改就可行呢?首先想想为什么P01中要按照v=V..0的逆序来循环。这是因为要保证第i次循环中的状态f[i][v]是由状态f[i-1][v-c[i]]递推而来。换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i件物品”这件策略时,依据的是一个绝无已经选入第i件物品的子结果f[i-1][v-c[i]]。而现在完全背包的特点恰是每种物品可选无限件,所以在考虑“加选一件第i种物品”这种策略时,却正需要一个可能已选入第i种物品的子结果f[i][v-c[i]],所以就可以并且必须采用v=0..V的顺序循环。这就是这个简单的程序为何成立的道理。

    值得一提的是,上面的伪代码中两层for循环的次序可以颠倒。这个结论有可能会带来算法时间常数上的优化。

    这个算法也可以以另外的思路得出。例如,将基本思路中求解f[i][v-c[i]]的状态转移方程显式地写出来,代入原方程中,会发现该方程可以等价地变形成这种形式:

f[i][v]=max{f[i-1][v],f[i][v-c[i]]+w[i]}

将这个方程用一维数组实现,便得到了上面的伪代码。

最后抽象出处理一件完全背包类物品的过程伪代码:

procedure_CompletePack(cost,weight)
    for(v=c[i]..V)
        f[v]=max{f[v],f[v-c[i]]+w[i]};

总结
    完全背包问题也是一个相当基础的背包问题,它有两个状态转移方程,分别在“基本思路”以及“O(VN)的算法“的小节中给出。希望你能够对这两个状态转移方程都仔细地体会,不仅记住,也要弄明白它们是怎么得出来的,最好能够自己想一种得到这些方程的方法。事实上,对每一道动态规划题目都思考其方程的意义以及如何得来,是加深对动态规划的理解、提高动态规划功力的好方法。

P03: 多重背包问题

题目
    有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件容量是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的容量总和不超过背包容量,且价值总和最大。

基本算法
    这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程:

f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i],f[i][v] }(0<=k<=n[i])

    复杂度是O(V*Σn[i])。

转化为01背包问题
    另一种好想好写的基本方法是转化为01背包求解:把第i种物品换成n[i]件01背包中的物品,则得到了物品数为Σn[i]的01背包问题,直接求解,复杂度仍然是O(V*Σn[i])。

    但是我们期望将它转化为01背包问题之后能够像完全背包一样降低复杂度。仍然考虑二进制的思想,我们考虑把第i种物品换成若干件物品,使得原问题中第i种物品可取的每种策略——取0..n[i]件——均能等价于取若干件代换以后的物品。另外,取超过n[i]件的策略必不能出现。

    方法是:将第i种物品分成若干件物品,其中每件物品有一个系数,这件物品的容量和价值均是原来的容量和价值乘以这个系数。使这些系数分别为1,2,4,...,2^(k-1),n[i]-2^k+1,且k是满足n[i]-2^k+1>0的最大整数。例如,如果n[i]为13,就将这种物品分成系数分别为1,2,4,6的四件物品。

    分成的这几件物品的系数和为n[i],表明不可能取多于n[i]件的第i种物品。另外这种方法也能保证对于0..n[i]间的每一个整数,均可以用若干个系数的和表示,这个证明可以分0..2^k-1和2^k..n[i]两段来分别讨论得出,并不难,希望你自己思考尝试一下。

    这样就将第i种物品分成了O(log2n[i])种物品,将原问题转化为了复杂度为O(V*Σlog2n[i])的01背包问题,是很大的改进。

    下面给出O(log amount)时间处理一件多重背包中物品的过程,其中amount表示物品的数量:

procedure MultiplePack(cost, weight, amount) {
    if(cost*amount>=V)  //如果i种物品足够多,那么就相当与无限多了                          
        CompletePack(cost, weight);// 完全背包处理
        return;
    integer k=1;
    while(k<amount)
        ZeroOnePack(k*cost, k*weight);
        amount=amount-k ;
        k=k*2 ;
        ZeroOnePack(amount*cost, amount*weight);
}

    希望你仔细体会这个伪代码,如果不太理解的话,不妨翻译成程序代码以后,单步执行几次,或者头脑加纸笔模拟一下,也许就会慢慢理解了。

O(VN)的算法
    多重背包问题同样有O(VN)的算法。这个算法基于基本算法的状态转移方程,但应用单调队列的方法使每个状态的值可以以均摊O(1)的时间求解。由于用单调队列优化的DP已超出了NOIP的范围,故本文不再展开讲解。我最初了解到这个方法是在楼天成的“男人八题”幻灯片上。

小结
    这里我们看到了将一个算法的复杂度由O(V*Σn[i])改进到O(V*Σlog n[i])的过程,还知道了存在应用超出NOIP范围的知识的O(VN)算法。希望你特别注意“拆分物品”的思想和方法,自己证明一下它的正确性,并将完整的程序代码写出来。

P04: 混合三种背包问题

问题
    如果将P01、P02、P03混合起来。也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。应该怎么求解呢?

01背包与完全背包的混合
    考虑到在P01和P02中给出的伪代码只有一处不同,故如果只有两类物品:一类物品只能取一次,另一类物品可以取无限次,那么只需在对每个物品应用转移方程时,根据物品的类别选用顺序或逆序的循环即可,复杂度是O(VN)。伪代码如下:

for i=1..N
    if 第i件物品属于01背包
        for v=V..0 
            f[v]=max{f[v],f[v-c[i]]+w[i]};
    else if 第i件物品属于完全背包
        for v=0..V
            f[v]=max{f[v],f[v-c[i]]+w[i]};

再加上多重背包
    如果再加上有的物品最多可以取有限次,那么原则上也可以给出O(VN)的解法:遇到多重背包类型的物品用单调队列解即可。但如果不考虑超过NOIP范围的算法的话,用P03中将每个这类物品分成O(log n[i])个01背包的物品的方法也已经很优了。

    当然,更清晰的写法是调用我们前面给出的三个相关过程。

for i=1..N
    if 第i件物品属于01背包
        ZeroOnePack(c[i],w[i])
    else if 第i件物品属于完全背包
        CompletePack(c[i],w[i])
    else if 第i件物品属于多重背包
        MultiplePack(c[i],w[i],n[i])

    在最初写出这三个过程的时候,可能完全没有想到它们会在这里混合应用。我想这体现了编程中抽象的威力。如果你一直就是以这种“抽象出过程”的方式写每一类背包问题的,也非常清楚它们的实现中细微的不同,那么在遇到混合三种背包问题的题目时,一定能很快想到上面简洁的解法,对吗?

小结
    有人说,困难的题目都是由简单的题目叠加而来的。这句话是否公理暂且存之不论,但它在本讲中已经得到了充分的体现。本来01背包、完全背包、多重背包都不是什么难题,但将它们简单地组合起来以后就得到了这样一道一定能吓倒不少人的题目。但只要基础扎实,领会三种基本背包问题的思想,就可以做到把困难的题目拆分成简单的题目来解决。

ACM选手必备:混合背包的二进制优化技巧(附C++竞赛模板) 本文深入解析ACM竞赛中的混合背包问题,重点介绍二进制优化技巧及其C++实现模板。通过将多重背包转化为01背包的指数分组策略,显著提升算法效率至O(N*V*logS),并附赠经过竞赛验证的完整代码框架,帮助选手快速掌握这一动态规划核心优化技术。 阅读详情

相关推荐

混合背包问题 3 种解法对比:从 O(N*V*S) 到 O(N*V*logS) 的优化路径

本文深入探讨混合背包问题的三种优化解法,从基础的O(N*V*S)三重循环到二进制优化的O(N*V*logS),再到单调队列优化的O(N*V)最优解。通过动态规划技术,详细解析了01背包、完全背包和多重背包的综合处理策略,为信息学奥赛和算法竞赛提供了实用的性能优化方案。

weixin_42116058的博客 342

背包问题(5):混合背包

混合背包就是将前面三种基本的背包问题叠加成较复杂的问题。也就是说,有的物品只可以取一次(0/1背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。 0/1背包与完全背包的混合比较简单。如果只有两类物品:一类物品只能取一次,另一类物品可以取无限次,那么只需在对每个物品应用转移方程时,根据物品的类别选用逆序(0/1背包)或顺序(完全背包)的循环即可。 一般可以编写如下的循环。​ for (i=1;i<=N;i++) ...

cmdos的专栏 2778

背包问题 - 01背包 、完全背包 、多重背包、还有混合背包

背包问题 主要讲三个背包: 01 背包,完全背包,多重背包。 01 背包 01背包的意思是选一个或者不选。 朴素版: #include <iostream> #include <algorithm> using namespace std; const int N = 1111; int v[N]; //v[i]表示i个物品的价值 int w[N]; //w[i]表示第...

kylinholmes的博客 374

混合背包问题

混合背包问题

Turing_Sheep的博客 801

从BIOS到路由器:深入拆解SPI NOR Flash的硬件连接与‘芯片内执行’(XIP)奥秘

本文深入解析SPI NOR Flash的硬件连接与‘芯片内执行’(XIP)技术,从BIOS到路由器的应用场景出发,详细介绍了其架构精髓、典型连接方案、时序设计及性能优化方法。通过实际案例和参数对比,帮助开发者掌握NOR Flash在嵌入式系统中的关键作用与设计技巧,提升电路设计效率与可靠性。

weixin_30522183的博客 491

论文精读——A Comprehensive Survey of Continual Learning: Theory, Method and Application

为了应对现实世界的动态性,智能系统需要在其整个生命周期中逐步获取、更新、积累并利用知识。这种能力被称为Continue Learning(持续学习)。从广义上讲,持续学习明显受到catastrophic forgetting(灾难性遗忘)的限制,即学习新任务通常会导致旧任务的性能急剧下降。Continue Learning的核心目的有二,其一为(稳定性与可塑性间的权衡),其二为(足够的任务内/任务间泛化能力)。

xsddys的博客 1241

【算法与数据结构】—— 动态规划之背包问题

背包问题分为多种,其中最常见的主要是三类:01背包、完全背包、多重背包。这里面最经典的是01背包问题,它基本上已经成为了事实上的动态规划入门级必学算法。下面,我们将对上述的三类背包问题逐个分析。

酱懵静的博客 2万+

V-rep机器人仿真(Win10):UR5+RG2+Kinect+YOLOV3+DDPG+Pytorch(第四部分:YOLOV3图像识别)

这是一个V-rep机器人仿真实验,较为简单,适合初学者在入门图像识别、机器学习、机器人学的内容时进行学习与训练。 实验涉及的内容有:V-rep机器人仿真,YOLOV3图像识别,强化学习DDPG,UR5机械臂及RG2机械手,Kinect摄像头。 使用环境:Win10,Pytorch0.4,V-rep 整个实验一共由多篇文章组成,本文是第四部分。 第四部分:YOLOV3图像识别 文章目录第四部分:YO...

weixin_42158966的博客 5836

动态规划学习(混合背包,有依赖的背包,以及背包思想)

混合背包问题就是混合01背包、完全背包和多重背包,可供选择的物体i可能有一个、或者无数个、或者有限个。所以,就不要考虑这么多了,直接分这三种情况考虑就行!!题意:就是说给我一个时间(背包容量),然后有n种樱花树,每个樱花树有自己的时间(花费)以及美学值(价值),但是每个种类的樱花树,数量是不同的这样就对了吗?当然不是,不用二进制优化就80分,所以我们需要对这种情况进行二进制优化,将多重背包分开为01背包,然后只区分是不是0即可。

2301_80475191的博客 588

SAP面试全过程(已拿offer)

周五打电话给我说过了SAP第一轮面试,第二轮要在下周四北京,这几天终于体会到了什么叫做重压下的感觉,越复习越虚,看别人的面经都感觉卧槽这问题也巨难了吧...连去北京可以见妹子这种事情都感觉一点心情都没有。面前准备固然是要有的,但关键是平时就要有料,多想想自己做的项目。当作一个给自己的提醒吧!

cloudray8580的专栏 4万+

【知识图谱】neo4j桌面版安装与配置-解决无法启功问题(2025年最新最全教程)

(经历过各种版本NEO4J,相比社区版而言,个人感觉桌面版更适合新手,安装调试更少更方便。如果是社区版改桌面版的,记得删除系统变量里NEO4J_HOME这个变量,否则会报错。

知识靠谱的博客 2万+

古有陈天华万字血书抗沙俄,今有本剧蒻万字背包虐dp(01,完全,多重,分组,混合等各种背包详解 + 板子题+ 奇奇怪怪滴变式题)

前言: 本文介绍了01背包、完全背包、多重背包、混合背包、分组背包等背包,并对其进行透彻的剖析,并附上了板子题,供您白嫖,以及一些奇葩变式,颇有意思,供你琢磨玩弄。此外绝大部分题都有二维数组和滚动数组的解析及代码,包您满意(那我们现在就让数组滚动起来叭o(≧v≦)o) 背包入门之01背包 简化的01背包 题意: 有一个箱子容量为V,同时有n个物品,每个物品有一个体积,要求n个物品中取若干个装进箱子,使得箱子的剩余空间最小 思路: 贪心是绝对不可以滴,怎么贪都不行滴 动态规划的话得找好状态,这个题是不可以选剩

Suryxin's blogs 462

Android 12.0 系统开机设置默认横屏显示

在12.0的系统产品开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从两部分来实现,一部分是开机动画横屏显示,另一部分是系统显示横屏显示,从这两方面就可以做到开机默认横屏显示了。

安卓兼职framework和app工程师的博客 3743

混合背包问题实战:如何用Python动态规划解决三种背包组合问题

本文详细介绍了混合背包问题的Python动态规划解决方案,涵盖01背包、完全背包和多重背包三种类型的组合处理。通过核心算法框架、二进制优化技术和完整代码实现,帮助开发者高效解决复杂背包问题,适用于资源分配、投资优化等实际场景。

milk5的博客 909

CloudCompare 二次开发(16)——计算点云最值

不依赖任何第三方点云相关库,使用ClopudCompare计算点云最值。

点云侠的博客 517

算法 | 基于MATLAB的增量式SVD技术综述:实现方法、代码示例与应用实践

效率提升:较传统SVD降低计算复杂度从On3O(n^3)On3至On2O(n^2)On2实时性:支持毫秒级动态数据更新资源友好:内存占用降低60%-80%[5]

尘世冰封的专栏 486

背包九讲(转载,大牛总结)

(牛人总结)背包九讲 收藏第一讲 01背包问题这是最基本的背包问题,每个物品最多只能放一次。 第二讲 完全背包问题第二个基本的背包问题模型,每种物品可以放无限多次。 第三讲 多重背包问题每种物品有一个固定的次数上限。 第四讲 混合三种背包问题将前面三种简单的问题叠加成较复杂的问题。 第五讲 二维费用的背包问题一个简单的常见扩展。 第六讲 分组的背包问题一种题目类型,也是一个有用...

dianyoudui1219的博客 122

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

背包问题详解

P01: 01背包问题 题目 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是: f[i][v]=max{f[i-1][v],f

Hackbuteer1的专栏 7117

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

背包问题(转)

01背包:每种物品只有一个,其价值为Vi,重量为Wi,可以选择装入背包或不装入,使背包物品总价值最大化。 定义F(i,j)为在前i件物品中选择若干件放入称重为j的背包,可以取得的最大价值。 装入背包:F(i,j)=F(i-1,j-Wi)+Vi 不装入背包:F(i,j)=F(i-1,j) 01背包的状态转换方程 F(i,j) = Max{ F(i-1,j-Wi)+Vi, F(i...

469

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

背包九讲

背包九讲   目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  第八讲 泛化物品  第九讲 背包问题问法的变化  附:USACO中的背包问题    前言 本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作...

独钓门前月 328

【算法进阶】背包问题的终极形态:混合背包通用模板与二进制拆分优化 (洛谷P1833 C++代码实现)

经典的背包问题定义。

h_a_o777oah的博客 414

dd大牛的背包九讲 studying......

背包九讲   目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  第八讲 泛化物品  第九讲 背包问题问法的变化  附:USACO中的背包问题    前言 本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作...

Sean 223

从‘外卖优化’到‘资源调度’:用Python背包问题模型,解决你身边的5个实际编程难题

本文探讨了如何利用Python实现背包问题模型(01背包、完全背包、多重背包)解决外卖优化、资源调度等5个实际编程难题。通过具体代码示例,展示了在有限预算下最大化满意度、服务器资源分配、电商库存优化等场景的应用,帮助读者掌握这一强大的算法工具。

weixin_30412167的博客 455

背包问题终极指南:混合背包的5种实际应用场景与优化技巧

本文深入解析了混合背包问题的核心概念与算法实现,重点介绍了其在电商促销、云计算资源调度等5种实际场景中的应用。通过对比基础二维DP、一维滚动数组优化及二进制优化等技巧,提供了针对不同数据规模的解决方案,帮助开发者和算法爱好者掌握这一资源优化配置的核心模型。

pz890123的博客 890

算法题(225):樱花

本题的背包类型是根据p值区分的,p为0时完全背包(无限次数),p为1时01背包(看一次),p大于1时多重背包(看多次)完全背包需要依赖当前行左侧,所以横向我们需要从小到大遍历,而所有背包都要依赖上一行,所以纵向需要从小到大遍历。f[i][j]表示在前i棵树中看,保证使用时间不超过j的前提下,所欣赏到的最高美学价值。对于其他背包来说,需要保证横向从大到小填写,保证前面(左侧)数据不被更新。对于完全背包来说,需要保证横向从小到大填,保证前面(左侧)数据被更新。我们直接输出f[n][m]即可。

2301_79954395的博客 252

背包九讲(dp问题详解)

【代码】背包九讲(dp问题详解)

weixin_64394633的博客 2191
上一篇: 赫夫曼(Huffman)树/编码
下一篇: Python - 多进程使用教程
Korpse
博客等级 码龄9年 115粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值