01背包和完全背包

最近學(xué)習(xí)《背包問題九講》,對(duì)0-1背包和完全背包有了新的認(rèn)識(shí)矾克。最新版本請(qǐng)?jiān)L問 https://github.com/tianyicui/pack 查閱。

1.01背包問題

關(guān)于01背包問題的方程式如下续镇,此時(shí)的時(shí)間復(fù)雜度位O(NV),N為狀態(tài)數(shù)目收毫,V為背包總大小闸昨,空間復(fù)雜度位O(NV):

F [i, v] = max {F [i ? 1, v], F [i ? 1, v ? C i ] + W i }

通過復(fù)用DP矩陣,可以將之轉(zhuǎn)換為O(V)况鸣,V為背包大小牢贸,此時(shí)的偽代碼為:

F [0..V ] ←0
for i ← 1 to N
    for v ← V to C i
          F [v] ← max {F [v], F [v ? C i ] + W i }

2.完全背包

這個(gè)問題非常類似于01背包問題,所不同的是每種物品有無限件。也就
是從每種物品的角度考慮,與它相關(guān)的策略已并非取或不取兩種,而是有
取 0 件镐捧、取 1 件潜索、取 2 件......直至取 ?V /C i ? 件等許多種。
如果仍然按照解01背包時(shí)的思路,令 F [i, v] 表示前 i 種物品恰放入一個(gè)容
量為 v 的背包的最大權(quán)值懂酱。仍然可以按照每種物品不同的策略寫出狀態(tài)轉(zhuǎn)移方程,像這樣:

F [i, v] = max (F [i ? 1, v], F [i, v ? C i ] + W i )

其O(V)的偽代碼如下:

F [0..V ] ←0
    for i ← 1 to N
        for v ← C i to V
              F [v] ← max (F [v], F [v ? C i ] + W i )

3.背包問題應(yīng)用

第一節(jié)已經(jīng)給出了01背包在O(V)條件下的偽代碼竹习,這里給出其O(NV)狀態(tài)下的偽代碼:

F [0, 0..V ] ← 0
    for i ← 1 to N
        for v ← C i to V
            F [i, v] ← max {F [i ? 1, v], F [i ? 1, v ? C i ] + W i }

上面可以看到,從i-1狀態(tài)下變遷過來的狀態(tài)之間是隔離的列牺,每個(gè)i狀態(tài)和i-1狀態(tài)相關(guān)整陌。
而完全背包則不是這樣,按照F [i, v] = max {F [i ? 1, v ? kC i ] + kW i | 0 ≤ kC i ≤ v}的轉(zhuǎn)移方程獲得如下代碼:

F[0][] ← {0}  
F[][0] ← {0}  
for i←1 to N  
    do for j←1 to V  
        do for k←0 to j/C[i]  
           if(j >= k*C[i])  
                then F[i][k] ← max(F[i][k],F[i-1][j-k*C[i]]+k*W[i])  
return F[N][V] 

如此情況下的時(shí)間復(fù)雜度為O(NV∑(j/C[i]))瞎领。要獲得O(VN)時(shí)間復(fù)雜度的完全背包解法泌辫,需要用到第二節(jié)使用的遞推關(guān)系式,其偽代碼第二節(jié)也已經(jīng)介紹了九默。
這里我使用LeetCode上343. Integer Break 來講解震放。
第一種,不服用DP矩陣驼修。

public int integerBreak(int n) {
        if (n <= 1) return 0;
        int[][] dp = new int[n + 1][n + 1];
        dp[0][1] =1;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (j < i) {
                    dp[i][j] = dp[i-1][j];
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j],
                            Math.max(dp[i][j - i], j - i) *
                                    Math.max(dp[i][i], i));
                }
            }
        }
        return dp[n][n];
    }

第二種殿遂,復(fù)用DP矩陣。

    public int integerBreak(int n) {
        int[] dp = new int[n + 1];
       dp[1] = 1;
       for(int i = 2; i <= n; i ++) {
           for(int j = 1; j < i; j ++) {
               dp[i] = Math.max(dp[i], (Math.max(j,dp[j])) * (Math.max(i - j, dp[i - j])));
           }
       }
       return dp[n];
    }

4.總結(jié)

(Tips:O(NV)時(shí)間復(fù)雜度)
× 01背包的狀態(tài)遷移是前后無關(guān)的乙各,i狀態(tài)由i-1狀態(tài)遷移而來墨礁,因此,必須保證前狀態(tài)的狀態(tài)無法影響后狀態(tài)耳峦。因此饵溅,在O(V)空間復(fù)雜度下,必須從后往前遷移狀態(tài)妇萄,防止?fàn)顟B(tài)疊加。
× 完全背包的狀態(tài)是需要疊加的咬荷。因此在O(NV)空間復(fù)雜度狀態(tài)下的狀態(tài)遷移冠句,需要收到i狀態(tài)下其他背包的影響。O(V)空間復(fù)雜度下幸乒,則從前向后推移狀態(tài)懦底。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子聚唐,更是在濱河造成了極大的恐慌丐重,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杆查,死亡現(xiàn)場(chǎng)離奇詭異扮惦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亲桦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門崖蜜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人客峭,你說我怎么就攤上這事豫领。” “怎么了舔琅?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵等恐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我备蚓,道長(zhǎng)课蔬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任星著,我火速辦了婚禮购笆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘虚循。我一直安慰自己同欠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布横缔。 她就那樣靜靜地躺著铺遂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茎刚。 梳的紋絲不亂的頭發(fā)上襟锐,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音膛锭,去河邊找鬼粮坞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛初狰,可吹牛的內(nèi)容都是我干的莫杈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奢入,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼筝闹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤关顷,失蹤者是張志新(化名)和其女友劉穎糊秆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體议双,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痘番,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了聋伦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夫偶。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖觉增,靈堂內(nèi)的尸體忽然破棺而出兵拢,到底是詐尸還是另有隱情,我是刑警寧澤逾礁,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布说铃,位于F島的核電站,受9級(jí)特大地震影響嘹履,放射性物質(zhì)發(fā)生泄漏腻扇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一砾嫉、第九天 我趴在偏房一處隱蔽的房頂上張望幼苛。 院中可真熱鬧,春花似錦焕刮、人聲如沸舶沿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)括荡。三九已至,卻和暖如春溉旋,著一層夾襖步出監(jiān)牢的瞬間畸冲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工观腊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邑闲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓梧油,卻偏偏與公主長(zhǎng)得像苫耸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婶溯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 01背包問題(注意看注釋) 有N件物品和一個(gè)容量為V的背包。第i件物品的費(fèi)用是c[i],價(jià)值是w[i]迄委。每種物品僅...
    謎碌小孩閱讀 1,180評(píng)論 0 3
  • 我在進(jìn)行一些互聯(lián)網(wǎng)公司的技術(shù)筆試的時(shí)候,對(duì)于我來說最大的難題莫過于最后的那幾道編程題了信轿,這對(duì)算法和數(shù)據(jù)結(jié)構(gòu)有一定程...
    檸檬烏冬面閱讀 19,913評(píng)論 2 19
  • 2.1 題目 有 N 種物品和一個(gè)容量為 V 的背包,每種物品都有無限件可用晃痴。放入第 i 種物品的費(fèi)用是 C i ...
    Gitfan閱讀 497評(píng)論 0 0
  • 終于來到最后一個(gè)系列了即彪,整個(gè)系列下來發(fā)現(xiàn)大神的總結(jié)和思考就是那么的厲害紧唱,自己能在這里學(xué)習(xí)和了解不同的思維方式并能運(yùn)...
    檸檬烏冬面閱讀 3,872評(píng)論 0 3
  • 以前的我,對(duì)于今天這樣的日子隶校,并不喜歡漏益,可能內(nèi)心里總不愿與"婦女"的稱謂聯(lián)系在一起吧。 但近幾年來深胳,隨著網(wǎng)絡(luò)與微信...
    麗語(yǔ)閱讀 401評(píng)論 2 2