• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            多重背包問題樸素時間復(fù)雜度為O(NMS)(這里S是所有物品的數(shù)量s之和),經(jīng)過二進(jìn)制優(yōu)化后時間復(fù)雜度為O(NMlog2S),這個復(fù)雜度已經(jīng)能夠應(yīng)付大多數(shù)題了,但對于某些特別卡時間的題(比如N*M=107的),仍然會TLE。這時,可以用單調(diào)隊(duì)列優(yōu)化,時間復(fù)雜度降為O(NM)。

            首先看一下多重背包問題的樸素轉(zhuǎn)移方程:
            F[i][j] = max{F[i-1][j-x*w[i]]+x*v[i]} (0<=x<=s[i], j>=x*w[i])
            如果使用滾動數(shù)組,忽略i這一維,設(shè)w0=w[i],v0=v[i],s0=s[i],得:
            F[j] = max{F[j-x*w0]+x*v0} (0<=x<=s0, j>=x*w0)
            看上去這和單調(diào)隊(duì)列木有神馬關(guān)系,因?yàn)闆Q策下標(biāo)(j-x*w0)不是一個整數(shù)區(qū)間,中間是有間隔的。然而可以發(fā)現(xiàn),這個方程的限制條件“0<=x<=s0,j>=x*w0”,也就是x的下界是max{0, j/w0(下取整)},當(dāng)j單調(diào)遞增時,這個下界也是單調(diào)遞增的。這滿足單調(diào)隊(duì)列優(yōu)化的條件中的“決策下標(biāo)的下界單調(diào)”……不是,還不能這樣說,因?yàn)檫@里的決策下標(biāo)是j-x*w0,而不是x。
            那么怎樣才可以把決策下標(biāo)變?yōu)閤?

            將決策下標(biāo)按照模w0的余數(shù)進(jìn)行分類,可以分成w0類,分別對應(yīng)模w0余0、余1……余(w0-1)的情況。這時,上面方程中的所有決策下標(biāo)j-x*w0都是同一類的。進(jìn)一步,設(shè)q =j/w0(下取整),r=j%w0,則j=q*w0+r,對于某個決策下標(biāo)j',設(shè)k=(j'-r)/w0,即j'=k*w0+r。顯然可以發(fā)現(xiàn),k的取值范圍是:k>=0且q-s0<=k<=q,也即k的下界是max{0, q-s0}——隨j的單調(diào)而單調(diào)。
            然后,轉(zhuǎn)移方程可以改為(這里把r當(dāng)成一個已知量了):
            F[q*w0+r] = max{F[k*w0+r]+(q-k)*v0} (k>=0且q-s0<=k<=q)
            即F[q*w0+r]=max{F[k*w0+r]-k*v0}+q*v0 (k>=0且q-s0<=k<=q)
            設(shè)G[k]=F[k*w0+r]得:
            G[q]=max{G[k]-k*v0}+q*v0 (k>=0且q-s0<=k<=q)
            這個方程已經(jīng)可以使用單調(diào)隊(duì)列來優(yōu)化了!

            這樣可以得出算法:
            (1)從1到n,枚舉i,建立w[i]個空的單調(diào)隊(duì)列,每個隊(duì)列的元素都是兩個int值:(k, val),表示轉(zhuǎn)換后下標(biāo)和決策值(G[k]-k*v[i]);
            (2)從0到m,枚舉j,得出q、r的值,對于隊(duì)列r:
            【1】刪去隊(duì)首過時(k<q-m[i])的元素;
            【2】F[j]入隊(duì)(這里的F[j]指上一階段的F[j],即F[i-1][j]。因此這一步操作一定要先進(jìn)行),刪去隊(duì)尾所有決策值val不大于(F[j]-q*v[i])的元素。
            【3】取出隊(duì)首結(jié)點(diǎn),其val值加上q*v[i]后即為本階段F[j]的值。
            最后F[m]即為結(jié)果。總時間復(fù)雜度為O(NM)。

            其實(shí)這個是可以推廣的,即對于如下形式的轉(zhuǎn)移方程(其中H、G和W均為常量,B[i]為決策下標(biāo)的下界,隨i單調(diào)):
            F[i] = opt{F[i-x*H+W]}+G (B[i]<=i-x*H+W<i,x∈N
            都可以用上述的辦法進(jìn)行轉(zhuǎn)化,從而進(jìn)行單調(diào)隊(duì)列優(yōu)化。

            Feedback

            # re: 多重背包問題的單調(diào)隊(duì)列優(yōu)化  回復(fù)  更多評論   

            2014-05-03 19:13 by gga
            k的取值范圍是:k>=0且q-s0<=k<=q ;q-s0<=k是為什么

            # re: 多重背包問題的單調(diào)隊(duì)列優(yōu)化  回復(fù)  更多評論   

            2014-05-03 22:49 by gga
            ”然而可以發(fā)現(xiàn),這個方程的限制條件“0<=x<=s0,j>=x*w0”,也就是x的下界是max{0, j/w0(下取整)}“ 這個下界不對吧,是你所想的理想情況(j<=x*w0)吧?

            # re: 多重背包問題的單調(diào)隊(duì)列優(yōu)化  回復(fù)  更多評論   

            2014-05-09 20:37 by zzhhbyt
            @gga
            我也感覺q是可購買物品數(shù)量上限,s0是物品總量,q-s0不應(yīng)該是負(fù)數(shù)嗎?
            久久久久久久尹人综合网亚洲| 国产成人久久精品麻豆一区| 一级做a爰片久久毛片看看| 亚洲国产精品综合久久网络| 亚洲乱码日产精品a级毛片久久 | 国内精品久久久久| 99久久国产综合精品麻豆| 精品国产热久久久福利| 亚洲精品无码久久久久AV麻豆| 无码超乳爆乳中文字幕久久| 激情五月综合综合久久69| 亚洲国产精品成人久久| 91亚洲国产成人久久精品网址| 中文字幕精品久久久久人妻| 狠狠干狠狠久久| 久久综合狠狠综合久久综合88 | 精品久久久久久综合日本| 久久www免费人成精品香蕉| 久久久久久曰本AV免费免费| 国产精品嫩草影院久久| 2021久久国自产拍精品| 久久国产欧美日韩精品| 亚洲国产成人久久综合野外| 狠狠色丁香久久综合婷婷| 久久狠狠爱亚洲综合影院| 亚洲va久久久久| 国产亚洲婷婷香蕉久久精品| 久久久一本精品99久久精品66 | 国产精品视频久久久| 国产成人精品综合久久久久| 武侠古典久久婷婷狼人伊人| 亚洲精品高清国产一久久| 国产高潮国产高潮久久久| 久久综合精品国产二区无码| 久久久久久精品成人免费图片 | 亚洲国产香蕉人人爽成AV片久久| 国产精品久久久久9999高清| 996久久国产精品线观看| 久久精品国产亚洲av高清漫画| 色妞色综合久久夜夜| 熟妇人妻久久中文字幕|