完全背包問題(動態(tài)規(guī)劃法-DP含一維滾動數(shù)組優(yōu)化)

完全背包問題:
有n個重量分別為{w1,w2赁咙,…钮莲,wn}的物品免钻,它們的價值分別為{v1,v2崔拥,…极舔,vn},給定一個容量為W的背包链瓦。小偷要選擇從這些物品中偷一部分物品放入該背包的方案拆魏,每個物品可以偷任意個,要求選中的物品不僅能夠放到背包中慈俯,而且重量和為W具有最大的價值渤刃。
該題是0-1背包問題的擴(kuò)展,0-1背包是某個物品偷或者不偷贴膘,完全背包是某個物品要偷多少個溪掀?
從0-1背包問題那我們推斷出了一個狀態(tài)轉(zhuǎn)移公式:
B(i,w) = max( B(i-1,w) ,B(i-1,w-c(i))+v(i) )
其中,i=前i件物品,w=可用容量 c(i)=第i件物品容量步鉴,v(i)=第i件物品價值
對該公式不明白的可以參考我前面寫的0-1背包問題DP
所以揪胃,我們很容易推導(dǎo)出完全背包問題的狀態(tài)轉(zhuǎn)移公式:

    B(i,w) = max( B(i-1,w) ,B(i-1,w-c(i)*k)+v(i)*k )      1=<k<=[V/c(i)] ,V為總可用容量,是w的最大值  

如此氛琢,我們可以模擬0-1背包問題寫一個三層嵌套循環(huán)喊递,然而寫起來并不優(yōu)美,這個式子其實(shí)可以再簡化阳似,我們推導(dǎo)一下:

  1. B(i,w) = max( B(i-1,w) ,B(i-1,w-c(i)* k)+v(i)* k ) :1=<k<=[V/c(i)] 我們觀察B(i-1,w-c(i)* k)+v(i)* k 讓 k=k'+1骚勘,或者你也可以取k=x+1,k=y+1都行,k'只是一個新的系數(shù)表示
  2. 這樣一來撮奏,B(i-1,w-c(i)* k)+v(i)* k :1=<k<=[V/c(i)] 轉(zhuǎn)換到<==> B(i-1,w-c(i)-c(i)* k')+v(i)* k'+v(i) :0=<k'<=[V/c(i) -1]
  3. 另外(1)式可以表示為:B(i,w) = max( B(i-1,w-c(i)* k)+v(i)* k ) :0=<k<=[V/c(i)]
  4. 同樣 B(i,w-c(i)) = max( B(i-1,w-c(i)-c(i)* k)+v(i)* k ) : 0=<k<=[V/c(i)-1]
    觀察一下俏讹,(2)式的右邊和上面這個(4)式的右邊是一摸一樣的,所以得到了簡化式
    B(i,w) =max( B(i-1,w), B(i,w-c(i)) + v(i))
    時間復(fù)雜度減少了畜吊,因為少了一個嵌套循環(huán)

還可以優(yōu)化下空間復(fù)雜度泽疆。就像0-1背包問題一樣,我們做一維滾動數(shù)組優(yōu)化玲献。因為B(i,w)僅僅依賴于B(i-1,w)和B(i,w-c(i));
最終得到 B(w) =max( B(w), B(w-c(i)) + v(i)) 1=<k<=[V/c(i)]

偽代碼:

請注意for v = c[i] ... V 這和0-1背包問題是反向的因為B(i,w)用到了B(i,w-c(i));新值哦
for v = 0 ... V do B[v] = 0
    for i = 1 ... N do
      for w = c[i] ... V do
          B[w] = max{B[w], B[w-c[i]] + v[i]}

二維轉(zhuǎn)一維你需要了解一下滾動數(shù)組這個東西殉疼,然后完全背包的二維公式是 B(i,w) =max( B(i-1,w), B(i,w-c(i)) + v(i)) ,下標(biāo)有i代表的都是新值捌年,有i-1代表的都是舊值瓢娜,轉(zhuǎn)成一維后是 B(w) =max( B(w), B(w-c(i)) + v(i)) ,當(dāng)然如果要理解順序問題的話得這么寫: B(w)新 =max( B(w)舊, B(w-c(i))新 + v(i)) 礼预,你想下x=max(x,y)這個式子眠砾,y對應(yīng)B(w-c(i)),x是B(w)。w-c(i)比w小托酸,所以要先處理小的褒颈,循環(huán)從小往大更新

上Java代碼:


/**
 * @author  JaJIng
 */
class KnapSack{
    private static final int N = 5;//商品種類
    private static final int C = 20;//總可用容量
    private static final int w[]={2,3,4,5,9};  //每個商品容量
    private static final int v[]={3,4,5,8,10}; //每個商品價值

    public static void main(String[] args) {
        KnapSack knapSack = new KnapSack();
        int bfull[] = knapSack.callFull();
        System.out.println(bfull[20);

    }
     //完全背包  ...
    public int[] callFull(){
        //計算用
        int B[] = new int[C+1];
        for(int n=0;n<N;n++){
            for(int c=w[n];c<=C;c++){
                B[c] = Math.max(B[c],B[c-w[n]]+v[n]);
            }
        }
        return B;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伙单,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哈肖,更是在濱河造成了極大的恐慌吻育,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淤井,死亡現(xiàn)場離奇詭異布疼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)币狠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門游两,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漩绵,你說我怎么就攤上這事贱案。” “怎么了止吐?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵宝踪,是天一觀的道長。 經(jīng)常有香客問我碍扔,道長瘩燥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任不同,我火速辦了婚禮厉膀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘二拐。我一直安慰自己服鹅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布百新。 她就那樣靜靜地躺著企软,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吟孙。 梳的紋絲不亂的頭發(fā)上澜倦,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音杰妓,去河邊找鬼。 笑死碘勉,一個胖子當(dāng)著我的面吹牛巷挥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播验靡,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼倍宾,長吁一口氣:“原來是場噩夢啊……” “哼雏节!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起高职,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤钩乍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后怔锌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寥粹,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年埃元,在試婚紗的時候發(fā)現(xiàn)自己被綠了涝涤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡岛杀,死狀恐怖阔拳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情类嗤,我是刑警寧澤糊肠,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站遗锣,受9級特大地震影響罪针,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜黄伊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一泪酱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧还最,春花似錦墓阀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扶叉,卻和暖如春勿锅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枣氧。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工溢十, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人达吞。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓张弛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吞鸭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349