【题目】

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

【基本思路】

和完全背包问题很类似,基本的方程只需将完全背包问题的方程略微一改即可。

对于第 i 种物品有 num[i]+1种策略:取 0 件,取 1 件……取 num[i] 件,令 f[i][v] 表示前 i 种物品恰放入一个容量为 V 的背包的最大权值。

其与完全背包的区别在于,完全背包中的物品是不限量的,而多重背包的第 i 种物品最多取 num[i] 个

则有状态转移方程:f[i][v]=max{ f[i-1][v-k*w[i]]+k*c[i] }(0<=k<=num[i]),时间复杂度是O(V*Σn[i])

考虑对 f[i][j] 进行空间优化,与完全背包

模版

for(i=1;i<=N;i++)//N种物品for(j=V;j>=0;j--)//容量为Vfor(k=0;k<=num[i];k++)//每种物品最多有num[i]个if(j-k*w[i]>=0)//当前容量-k个物品的重量>=0f[j]=max(f[j],f[j-k*w[i]]+k*c[i]);

【转化为01背包问题求解】

转化为01背包求解:把第i种物品换成n[i]件01背包中的物品,则得到了物品数为Σn[i]的0-1背包问题,直接求解,复杂度仍然是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 weight*amount>=VCompletePack(cost,weight)returninteger k=1while k<numZeroOnePack(k*cost,k*weight)amount=amount-kk=k*2ZeroOnePack(amount*cost,amount*weight)

动态规划 —— 背包问题 P03 —— 多重背包相关推荐

  1. 动态规划背包问题之多重背包详解

    背包问题前几篇文章: 01背包详解 完全背包详解 文章目录 一.什么是多重背包问题? 二.例题分析 1. 题目: 2.第一种:朴素做法 3.第二种:二进制优化 4.第二种:单调队列优化<待写&g ...

  2. 九十、动态规划系列背包问题之多重背包

    @Author:Runsen 曾几何时,才记得自己还是大一军训的菜鸟,带着 迷茫和憧憬踏入大学,踏入化工学院,却踏入这个行业,殊不知岁月是最高明的小偷,偷走时间,带走青春,一点线索也不留.大学的玩命学 ...

  3. 动态规划 背包问题小结 0-1背包(采药 九度第101题) 完全背包(Piggy-Bank POJ 1384) 多重背包(珍惜现在,感恩生活 九度第103题)

    本小结介绍0-1背包.完全背包以及多重背包问题 记忆要点: 0-1背包:二维数组情况下,顺序遍历体积或者倒序均可以                降维情况下需倒序遍历体积 完全背包:数组降维+顺序遍历 ...

  4. 为了OFFER,菜鸟的我必须搞懂动态规划系列三个背包问题之多重背包(二进制优化方法)

    @Author:Runsen @Date:2020/9/17 多重背包有三层循环,如果数据非常的大,那么程序就会变得非常悲伤.在多重背包的问题,其实更多的是考查多重背包的二进制优化方法.学习二进制优化 ...

  5. 动态规划背包问题之01背包详解

    文章目录 一.问题引入 1.什么是动态规划? 2.什么是背包问题? 3.什么是01背包? 4.背包问题怎么做? 二.例题讲解 1.题目: 2.分析 2.1 第一步:状态表示 2.2 第二步:确定状态转 ...

  6. 背包问题(多重背包+0-1背包)

    一:0-1背包问题 #include<iostream> #include<algorithm> #include<cstring> const int maxn= ...

  7. 动态规划 —— 背包问题 P04 —— 混合背包

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

  8. 背包问题之多重背包基础写法

    #多重背包问题 多重背包其实可以看做01背包问题的变形,某种物品有规定可取次数,我们可以看多有多个这种相同的物品,然后进行01背包求解. 看一个例题: 悼念512汶川大地震遇难同胞--珍惜现在,感恩生 ...

  9. ACM算法笔记(八)背包问题_多重背包

    问题描述: 现在给你一个容量为V的背包,有N个物品,其中第i件物品的重量为wi,价值为vi,第i件物品一共有si件,问在有限的容量内,最多可以拿到多少价值的物品. 题目分析: 仔细一看,多重背包问题和 ...

最新文章

  1. 多个tab可以组成一个表单吗 js_11个表单设计小技巧
  2. gitee项目能用SVN拉取吗_用好 Git 和 SVN,轻松驾驭版本管理
  3. 2020年春季学期信号与系统课程作业参考答案-第九次作业
  4. linux导出路径path,Linux kernel 绝对路径之d_path篇【转】
  5. 程序员面试系列——冒泡排序
  6. mysql pt-kill_percona-toolkit之pt-kill 杀掉mysql查询或连接的方法
  7. Sql注入工具php,phpcms框架SQL注入--基于Havij工具
  8. c4.5算法 程序语言,决策树之C4.5算法详解-Go语言中文社区
  9. 从运维角度浅谈MySQL数据库优化
  10. css 实现标签切换,CSS_纯CSS实现Tab切换标签效果代码,本文实例讲述了纯CSS实现Tab切 - phpStudy...
  11. Dom4j完整教程~Document对象相关
  12. word公式编辑器_【Word技巧】word使用终极技巧,工程人必会(四)
  13. 技术真的就不是那么重要了
  14. “考不上本科是智商有问题”,这位吴先生火了!涉事公司回应...
  15. Steam提示steam需要在线更新 + steam needs to be online to update最全解决方法
  16. 常用正则表达式匹配(中文字符)
  17. ADC学习(4)—— 电压比较器
  18. Synchronized保证线程安全的原理
  19. java中的main_Java中的main()方法详解
  20. 通过函数名称字符串发起调用/函数名反射

热门文章

  1. 2019升职加薪必备:你一定要修炼的产品思维
  2. flask mvc模式开发_Flask中文文档-转载
  3. 终于有人把tomcat讲清楚了。
  4. 原创|我以为我对Mysql索引很了解,直到我遇到了阿里的面试官
  5. JimuReport积木报表 — API数据源报表制作
  6. JS中的防抖跟节流(DebounceThrottle)
  7. JEEWX捷微企业号管家系统发布
  8. 工作流中ServiceTask的各种方法
  9. Maven Assembly Plugin - 如何将Maven工程打成一个可执行jar包
  10. 马尔科夫随机场之图像分割【二】