首页 > 其他分享 >第三讲 多重背包问题

第三讲 多重背包问题

时间:2023-06-29 21:45:52浏览次数:44  
标签:多重 背包 复杂度 第三 算法 01 物品 系数

题目

有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]|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(log n[i])种物品,将原问题转化为了复杂度为O(V*Σlog n[i])的01背包问题,是很大的改进。

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

procedure MultiplePack(cost,weight,amount)
    if cost*amount>=V
        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)算法。希望你特别注意“拆分物品”的思想和方法,自己证明一下它的正确性,并将完整的程序代码写出来。

标签:多重,背包,复杂度,第三,算法,01,物品,系数
From: https://www.cnblogs.com/shoshana-kong/p/17515255.html

相关文章

  • C#学习第三天
    变量学习1//知识点1折叠代码2//主要作用没让我们编程时逻辑更加清晰3//本质是编辑器提供给我们的预处理指令4//它只会在编辑时有用,发布了代码,或执行代码,它会被自动删除5//具体作用是可以将中间包......
  • 导入第三方项目maven插件报错
    导入一个微服务项目发现:Plugin'org.springframework.boot:spring-boot-maven-plugin:'notfound解决方式,添加版本号重新导入:查找下父工程的版本:发现是:2.3.9.RELEASE子工程微服务也要用这个版本的:原文:https://www.cnblogs.com/vevy/p/12246679.html......
  • 第一讲 01背包问题
    题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值......
  • 程序员的学历有多重要
    你们在哪儿上的大学啊?在某一天的午餐时分,为了缓解一下无聊的气氛,我和当时咨询公司里的一群程序员们开始聊天。在我问了这个问题之后,气氛开始变得热烈起来,大学足球成为我们的话题,每个学校的球队都免不了成为开玩笑的对象。然而我注意到有一个人乔突然变得非常沉默。因......
  • 动态规划-背包问题-完全背包问题:leetcode 377. 组合总和 Ⅳ
    1.题目读题给你一个由不同整数组成的数组nums,和一个目标整数target。请你从nums中找出并返回总和为target的元素组合的个数。题目数据保证答案符合32位整数范围。 示例1:输入:nums=[1,2,3],target=4输出:7解释:所有可能的组合为:(1,1,1,1)(1,1,2)(1,2,......
  • 动态规划 完全背包问题 -游戏最大伤害
     1.题目读题 游戏角色,有技能列表和魔法值,求能造成的最大伤害,例如:输入skill_list:[{mana_cost:10,damage:10},{mana_cost:12,damage:13}],current_mana:20,输出max_damage:20输入skill_list:[{mana_cost:10,damage:10},{mana_cost:12,damage:13}],current......
  • PACM Team (牛客多校) (DP 01背包, 维度较多)
    题目大意:给出n个物品,物品有4个空间值,然后有一个权值问在不超过最大的空间值时,最大的权值  思路:一开始想了很多其他思路没有想出来开始广搜算法,发现dp可以解决(注意看数据范围,是满足的)遇到奇怪的题,就试试dp,特别在数据范围很小的时候 ......
  • adb-将安卓设备里的第三方应用安装包,保存到本地电脑
    1.首先,确保您已经在计算机上安装了适当的adb驱动程序,并将adb添加到系统路径中。2.连接您的安卓设备到计算机上,并确保已启用USB调试模式。3.打开命令提示符或终端窗口,并运行以下命令以确认设备是否成功连接:adbdevices如果设备已成功连接,则会显示设备的唯一标识符。4.现在......
  • OOP第三次博客总结
    一、前言 这是本学期的最后一次博客,也是最后一次作业。但是由于前期打的基础不够扎实以及畏难的心理,PTA中的难题我大都没有解决,只通过了一些比较简单的测试点。虽然题量很大,但并不全是难得无法动手的,下面我会选取其中的一些题目进行分析。这些题目涉及的知识面也很广,老师上课讲......
  • PTA第三阶段题目集总结
    一.  前言PTA第三阶段的题目集包括了题集7891011。第7次题集是最后一次的菜单类,是对前一段菜单类的题目的总结,个人认为对于我来说有一定难度。第8次题集是课程成绩统计程序的第一次作业,要求输入课程信息与学生信息,最后再进行总结计算课程成绩以及学生和班级成绩后输出。......