0-1背包問(wèn)題

筆者心得

0-1背包問(wèn)題一直是筆者的心頭大患,從第一次接觸到現(xiàn)在做了三四遍了,愣是感覺(jué)有點(diǎn)不能熟練掌握羡铲,所有你大可不必因?yàn)橐淮巫龅秒y受而煩惱,大家都一樣哦儡毕。??
下面筆者力求用最簡(jiǎn)潔的語(yǔ)言與代碼來(lái)解決這個(gè)問(wèn)題也切。

解題思路

設(shè)共有l(wèi)en件物品,重量數(shù)組為weight[],價(jià)值容量為value[],背包容量為V(注意這里是大寫(xiě)的“V”)腰湾。

先寫(xiě)表達(dá)式:

dp[i][v] = Math.max(dp[i-1][v],dp[i-1][v-weight[i-1]]+value[i-1]);

關(guān)于表達(dá)式

我們用dp[i][v]來(lái)表示將前i件物品裝入容量為v(注意這里是小寫(xiě)的“v”)的背包所獲得的最大價(jià)值雷恃,那么它可以由兩個(gè)狀態(tài)轉(zhuǎn)移而來(lái),其一是dp[i-1][v],表示沒(méi)有裝第i件物品费坊,還有則是dp[i-1][v-weight[i]]+value[i],這里與上面表達(dá)式下標(biāo)不同倒槐,只是因?yàn)槭褂昧藈eight[0]與value[0]表示第一件物品,那么weight[i-]與value[i-1]則表示第i件物品附井。

上面表達(dá)式還有一點(diǎn)則是dp[i-1][v-weight[i]]+value[i],很多同學(xué)不理解數(shù)組后半部分為什么要用v-weight[i]讨越,只用v,即將前i物品裝入容量為v的背包獲得的價(jià)值=將前i-1件物品裝入容量為v的背包可以獲得的價(jià)值+物品i的價(jià)值永毅。假設(shè)我們總共5件物品把跨,只能裝入容量為8的背包兩件,而可以裝入容量為6的背包一件沼死,這顯然是不等價(jià)的着逐。

關(guān)于循環(huán)
for(int i=1;i<=len;i++) {
            for(int v=weight[i-1];v<=V;v++){...}
}

筆者一直對(duì)第二層循環(huán)很糾結(jié),首先由于v表示容量,我們很少寫(xiě)這樣的循環(huán)耸别,這里由于容量都是整數(shù)健芭,而且我們轉(zhuǎn)移方程需要不同容量的背包,因此我們需要計(jì)算對(duì)于不同容量的背包裝入前i件物品所獲得的最大價(jià)值秀姐,當(dāng)然這里v不能從1開(kāi)始吟榴,因?yàn)槲覀兊霓D(zhuǎn)移方程需要v-weight[i],而且將前1件物品裝入容量需求比它所需要的容量更小的背包是不實(shí)際的。

附代碼
public static void main(String[] args) {
        int weight[] = {3,5,1,2,2};
        int value[] = {4,5,2,1,3};
        
        int V =8;
        System.out.println(Bag_01(weight, value, V));
    //  System.out.println(Bag_01_2(weight, value, V));
    } 
    public static int Bag_01(int weight[],int value[],int V) {
        int len = weight.length;
        int res =0;
        int dp[][] = new int[len+1][V+1];
        for(int v=0;v<=V;v++) {
            //將前0件物品裝入容量為v的背包所獲得的最大價(jià)值
            dp[0][v] =0; 
        }
        
        for(int i=1;i<=len;i++) {
            for(int v=weight[i-1];v<=V;v++) {
                dp[i][v] = Math.max(dp[i-1][v],dp[i-1][v-weight[i-1]]+value[i-1]);
                
            }
            System.out.println("\n");
        }
        for(int i=1;i<=len;i++) {
            if(dp[i][V]>res)
                res = dp[i][V];
        }
        return res;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末囊扳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子兜看,更是在濱河造成了極大的恐慌锥咸,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件细移,死亡現(xiàn)場(chǎng)離奇詭異搏予,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)弧轧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)雪侥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人精绎,你說(shuō)我怎么就攤上這事速缨。” “怎么了代乃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵旬牲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我搁吓,道長(zhǎng)原茅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任堕仔,我火速辦了婚禮擂橘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摩骨。我一直安慰自己通贞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布仿吞。 她就那樣靜靜地躺著滑频,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唤冈。 梳的紋絲不亂的頭發(fā)上峡迷,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼绘搞。 笑死彤避,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夯辖。 我是一名探鬼主播琉预,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蒿褂!你這毒婦竟也來(lái)了圆米?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤啄栓,失蹤者是張志新(化名)和其女友劉穎娄帖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體昙楚,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡近速,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堪旧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片削葱。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖淳梦,靈堂內(nèi)的尸體忽然破棺而出析砸,到底是詐尸還是另有隱情,我是刑警寧澤爆袍,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布干厚,位于F島的核電站,受9級(jí)特大地震影響螃宙,放射性物質(zhì)發(fā)生泄漏蛮瞄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一谆扎、第九天 我趴在偏房一處隱蔽的房頂上張望挂捅。 院中可真熱鬧,春花似錦堂湖、人聲如沸闲先。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伺糠。三九已至,卻和暖如春斥季,著一層夾襖步出監(jiān)牢的瞬間训桶,已是汗流浹背累驮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舵揭,地道東北人谤专。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像午绳,于是被迫代替她去往敵國(guó)和親置侍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348