专题 线性DP-背包问题之多重背包
概念解释
什么是多重背包?可以结合完全背包理解。前面讲过,
现在我们增加一个约束:
物体选择的数目是不做限制的 - > 物体选择的数目是给定的
结合0-1背包的模型,现在概括出多重背包的特点:在多重背包的基础上,给出每一个物品最多选择的数量 ,在此基础上求解题目。给出模板题:
规律提炼
那很容易想到朴素的算法,也就是我们在说完全背包时定义的状态:
定义状态:
为当前处理到第
个物品,还剩下
的空间,第
个物品选了
个的价值。
现在考虑转移。
状态转移:
顺次枚举 ,
,
,分别从
,
,
,并且考虑每个物品选或不选。这样可以得到状态转移方程:
,其中
。
算法分析
上面朴素的算法是很高的复杂度的,现在尝试作优化。由先前的经验不难知道,时间复杂度可以优化到 ,空间复杂度可以到
,这是完全背包的优化,但是这里会有很大的不同。
我们介绍一个算法:二进制状态压缩。
概念:把物品i的件数ti分解成若干个件数的集合,集合里面的数字可 以组合成任意小于等于ti的件数,而且不会重复,之所以叫 二进制 分解,是因为这样分解可以用数字的二进制形式来解释。
下面有两个定理,我们列举出来。
定理1. 任何一个整数n均可以表示成:![n=a_{0}+a_{1}\times 2+a_{2}\times 2^{2}+a_{3}\times 2^{3}+...+a_{k}\times 2^{k},a_{i}\in \left \{ 0,1 \right \},i_{i}\in\left [ 1,k \right ],i\in Z](https://latex.csdn.net/eq?n%3Da_%7B0%7D+a_%7B1%7D%5Ctimes%202+a_%7B2%7D%5Ctimes%202%5E%7B2%7D+a_%7B3%7D%5Ctimes%202%5E%7B3%7D+...+a_%7Bk%7D%5Ctimes%202%5E%7Bk%7D%2Ca_%7Bi%7D%5Cin%20%5Cleft%20%5C%7B%200%2C1%20%5Cright%20%5C%7D%2Ci_%7Bi%7D%5Cin%5Cleft%20%5B%201%2Ck%20%5Cright%20%5D%2Ci%5Cin%20Z)
定理2. 一个正整数
可以被分解成 1, 2, 4, … ,
,
(
是满足
的最大整数)的形式,且1~n之内的所有整数均可以唯一表示成1, 2, 4, … ,
,
中某几个数的和的形式。
下面我们来证明。
证明1.
应用带余数除法,对 用
表示,并假设对于任意的
,都有上述定理成立,那么显然由归纳假设可知,
也一定是小于
的。所以
也是可以表示成
的。
将上面的表达式代入也即
中,展开并整理即得
并令,
,
……
比照对应项系数,
得证。
证明2.
由定理1.可知,对于任意整数,其二进制分解是存在且唯一的。所以对于一个区间来说,都是可以被表示的,那么剩下这个序列的最后一项可以表示从最后一项到 的区间内也是会被组合得到的。这里只是一个简单的说明,因为道理比较容易理解。
对于上述数学原理的应用
既然可以将一个整数分解成唯一的一种由二进制数表示的方法,为何不尝试将多个同种物品分解成不同种的物品?这样就成功将多重背包转化为了0-1背包。具体思想是:
将同种的物品数利用二进制拆分,化为多个不同种的但是数量均为1的物品,这样原问题就等效成一个0-1背包的问题,这样就方便求解了。
这个二进制拆分的时间复杂度易于证明。为 。总体时间复杂度为
,其中
为被分解的值。
参考程序
细节实现
单独给出二进制拆分的程序。
注意不能掉下最后一句。这是一个余项,表达式前面提到过,为 。这个余项是怎么得到的?其实就是前面的等比数列的和被
减去的值,又由定理1、2易知其作用——为了表示等比数列最后一项为区间左端点至
为区间右端点这一区间的值。
总结归纳
完全背包还是多重背包的特殊情况,即同种物品的选取是不做限制的,但是归根结底对于每个物品无非是选或不选,所以本质都是0-1背包。

浙公网安备 33010602011771号