【数学】多重背包问题的二进制优化的数学基础

多重背包问题是背包问题中的一类,具体是指,给定一个背包的容积 V V V,给定一列物品,以及其体积向量 w [ i ] w[i] w[i],价值向量 v [ i ] v[i] v[i]和个数向量 s [ i ] s[i] s[i],也就是物品 i i i的价值是 v [ i ] v[i] v[i],有 s [ i ] s[i] s[i]个,占用的体积是 w [ i ] w[i] w[i],问在如何在保证背包装得下的情况下,最大可能装的物品的总价值是多少。

在多重背包问题中有一种经典的二进制优化,可以把枚举物品数量的过程从 O ( s ) O(s) O(s)变成 O ( log ⁡ s ) O(\log s) O(logs),也把多重背包问题转化成了0-1背包问题。此文的目的是给其中的数学基础给予证明。

命题:给定一个正整数 x x x,和一个可重集合 S = { 1 , 2 , 4 , 8 , . . . , 2 k , r } S=\{1,2,4,8,...,2^k,r\} S={1,2,4,8,...,2k,r},其中 2 k + 1 − 1 ≤ x < 2 k + 2 2^{k+1}-1 \le x<2^{k+2} 2k+11x<2k+2。如果 x > 2 k + 1 − 1 x>2^{k+1}-1 x>2k+11,则取 r = x − ( 2 k + 1 − 1 ) r=x-(2^{k+1}-1) r=x(2k+11),此时 S S S里有 k + 2 k+2 k+2个数;否则的话 r = 0 r=0 r=0,就把 r r r从这列数中去掉,此时 S S S里有 k + 1 k+1 k+1个数。需要注意的是, r r r有可能等于集合中的其他数。证明:任何属于 1 ∼ x 1\sim x 1x的数,都可以表达为 S S S中若干数字的和(每个数字最多只能取一次),且表法唯一。

证明:
先证明 V = { 0 , 1 , 2 , 3 , 4 , . . . , 2 k − 1 } V=\{0,1,2,3,4,...,2^{k}-1\} V={0,1,2,3,4,...,2k1}是二元域 F = { 0 , 1 } F=\{0,1\} F={0,1}上的线性空间,其有一组基为 S = { 1 , 2 , 4 , . . . , 2 k − 1 } S=\{1,2,4,...,2^{k-1}\} S={1,2,4,...,2k1},其中 V V V中的加法是模 2 k 2^k 2k剩余类的加法,数乘是普通数字的乘法。

容易证明 V V V关于模 2 k 2^k 2k剩余类的加法是一个阿贝尔群,其余性质直接按照线性空间的定义验证即可,非常显然。接下来证明 S S S确实是一组基。数学归纳法。当 k = 0 k=0 k=0的时候 S = ∅ S=\empty S=,成立,当 k = 1 k=1 k=1时也显然成立。假设当 k = l k=l k=l时成立,当 k = l + 1 k=l+1 k=l+1时,由于已经知道 { 1 , 2 , 4 , . . . , 2 l − 1 } \{1,2,4,...,2^{l-1}\} {1,2,4,...,2l1}是一组基,也就是线性无关的,由于 2 l > ∑ i = 0 l − 1 2 i = 2 l − 1 2^l>\sum_{i=0}^{l-1}2^i=2^l-1 2l>i=0l12i=2l1,所以 2 l 2^l 2l无法由 { 1 , 2 , 4 , . . . , 2 l − 1 } \{1,2,4,...,2^{l-1}\} {1,2,4,...,2l1}线性表出,所以 { 1 , 2 , 4 , . . . , 2 l } \{1,2,4,...,2^{l}\} {1,2,4,...,2l}线性无关。

接下来证明此线性无关向量组可以表出 { 0 , 1 , 2 , . . . , 2 l + 1 − 1 } \{0,1,2,...,2^{l+1}-1\} {0,1,2,...,2l+11}。由于 ∀ x ≤ 2 l − 1 \forall x\le 2^l-1 x2l1,由数学归纳法,都可以由 { 1 , 2 , 4 , . . . , 2 l − 1 } \{1,2,4,...,2^{l-1}\} {1,2,4,...,2l1}线性表出,而对于任意满足 2 l ≤ x ≤ 2 l + 1 − 1 2^l\le x\le 2^{l+1}-1 2lx2l+11 x x x,都有 0 ≤ x − 2 l ≤ 2 l − 1 0\le x-2^l\le 2^l-1 0x2l2l1,所以 x − 2 l x-2^l x2l可由 { 1 , 2 , 4 , . . . , 2 l − 1 } \{1,2,4,...,2^{l-1}\} {1,2,4,...,2l1}线性表出,所以 x x x可由 { 1 , 2 , 4 , . . . , 2 l − 1 , 2 l } \{1,2,4,...,2^{l-1},2^l\} {1,2,4,...,2l1,2l}线性表出。由数学归纳法,证明完毕。

接下来证明原命题。如果 n ≤ 2 k + 1 − 1 n\le 2^{k+1}-1 n2k+11,那么由上面的命题, n n n可由 S = { 1 , 2 , 4 , . . . , 2 k } S=\{1,2,4,...,2^k\} S={1,2,4,...,2k}唯一线性表出,由于二元域 F = { 0 , 1 } F=\{0,1\} F={0,1},所以当然最多取一次。 r = 0 r=0 r=0的情况已经被包含在上面。如果 2 k + 1 ≤ n ≤ x 2^{k+1}\le n\le x 2k+1nx r > 0 r>0 r>0,则有 2 k + 1 − r ≤ n − r ≤ 2 k + 1 − 1 2^{k+1}-r\le n-r\le 2^{k+1}-1 2k+1rnr2k+11,由归纳法 n − r n-r nr能被 S = { 1 , 2 , 4 , . . . , 2 k } S=\{1,2,4,...,2^k\} S={1,2,4,...,2k}线性表出,所以 n n n能被 { 1 , 2 , 4 , . . . , 2 k , r } \{1,2,4,...,2^k,r\} {1,2,4,...,2k,r}唯一线性表出。

这个命题还有非常简单的证明方法。取一个从 V V V k k k 01 01 01向量的同构映射,映射方式是二进制表示,然后所有命题都按照后者来证,一切都变得很显然,也不需要数学归纳法了。

由这个命题,我们可以对很多要枚举 1 ∼ n 1\sim n 1n的问题进行优化,优化成 log ⁡ n \log n logn的复杂度。树状数组就是其的一种应用。

你可能感兴趣的:(数学)