dp---背包

01背包

n種物品,一個承重量為m的背包奕剃,每種物品最多只能拿一個或者不拿,且每個物品都有價值v[i]和重量w[i]纵朋,問怎么拿使背包內(nèi)物品價值最大。
定義dp[i][j]表示走到第i個物品操软,背包重量為j時的價值宪祥。
轉移方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
dp[i-1][j]表示不拿當前物品聂薪,背包重量為j時的價值
dp[i-1][j-w[i]] + v[i]表示當前拿過后品山,背包重量為j時的價值

for(int i=1; i<=n; i++){
    for(int j=0; j<=m; j++){
        if(j >= w[i]){//當前承重量為j時能放進
            dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);
        }else
            dp[i][j] = dp[i-1][j];
        }
    }
}
 //dp[n][m]就是最大價值

可以發(fā)現(xiàn)處理第i個物品時,只需要知道i-1的狀態(tài)就行了。
滾動數(shù)組優(yōu)化:

for(int i=1; i<=n; i++){
    for(int j=m; j>=w[i]; j--){//一定是從m到w[i],反了是完全背包了
        dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
    }
}
//dp[m]就是最大價值

注意for(int j=m; j>=w[i]; j--)肘交,一定是從大到小,容量大的狀態(tài)需要通過容量小的狀態(tài)轉移過來涯呻。如果先更新容量小的狀態(tài),就會重復計算复罐,變成完全背包。

完全背包

只有一個條件跟01背包不一樣胀滚,每種物品有無數(shù)個,隨便拿咽笼。
轉移方程dp[i][j] = max(dp[i-1][j-k*w[i]] + k*v[i]), 0 <= k*w[i] <= m
這里k就是拿的數(shù)量。
還是可以用滾動數(shù)組

for(int i=1; i<=n; i++){
    for(int j=w[i]; j<=m; j++){//從w[i]到m,跟01相反
        dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
    }
}
//dp[m]就是最大價值

先更新小的會影響大的剑刑,很巧妙的地方就是利用重復計算達到拿多個的目的。

多重背包

只是跟前兩個背包條件不一樣,現(xiàn)在每種物品有num[i]
轉移方程dp[i][j] = max(dp[i-1][j-k*w[i]] + k*v[i]), 0 <= k <= num[i] 且 k*w[i] <= m
跟完全背包差不多施掏。
使用滾動數(shù)組:

void _01(int w, int v, int m){//01背包,
    for(int i=m; i>=w; i--){
        dp[i] = max(dp[i], dp[i-w] + v);
    }
}
void _all(int w, int v, int m){//完全背包
    for(int i=w; i<=m; i++){
        dp[i] = max(dp[i], dp[i-w] + v);
    }
}
//利用上面兩個函數(shù),多重背包如下
for(int i=1; i<=n; i++){//遍歷每種物品
    if(num[i]*w[i] > m){
        //背包裝不下所有當前物品七芭,就可以看做完全背包
        _all(w[i], v[i], m);
    }else{
        //裝的下就進行多次01背包
        //如果num[i] = 10
        //每次拿 1 2 4 3 個
        //這里相當于拿了10輪,這么處理更快
        int k=1;
        while(k<num[i]){
            _01(k*w[i], k*v[i], m);
            num[i] -= k;
            k <<= 1;
        }
        _01(num[i]*w[i], num[i]*v[i], m);
    }
}
//dp[m]就是結果

總結

三種背包都不算難毁菱,不用滾動數(shù)組更好理解,不需要用滾動數(shù)組的時候直接套轉移方程正常dp就行贮庞。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末究西,一起剝皮案震驚了整個濱河市窗慎,隨后出現(xiàn)的幾起案子卤材,更是在濱河造成了極大的恐慌,老刑警劉巖扇丛,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帆精,居然都是意外死亡,警方通過查閱死者的電腦和手機卓练,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘱么,“玉大人顽悼,你說我怎么就攤上這事曼振∥盗” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵府蛇,是天一觀的道長屿愚。 經(jīng)常有香客問我汇跨,道長,這世上最難降的妖魔是什么穷遂? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任蚪黑,我火速辦了婚禮盅惜,結果婚禮上忌穿,老公的妹妹穿的比我還像新娘抒寂。我一直安慰自己掠剑,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布朴译。 她就那樣靜靜地躺著,像睡著了一般眠寿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盯拱,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音迹辐,去河邊找鬼。 笑死明吩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的印荔。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼仍律,長吁一口氣:“原來是場噩夢啊……” “哼实柠!你這毒婦竟也來了水泉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤钢拧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后源内,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡膜钓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年卿嘲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腔寡。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖放前,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凭语,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布似扔,位于F島的核電站,受9級特大地震影響炒辉,放射性物質發(fā)生泄漏。R本人自食惡果不足惜黔寇,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缝裤。 院中可真熱鬧,春花似錦憋飞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厘擂。三九已至答倡,卻和暖如春驴党,著一層夾襖步出監(jiān)牢的瞬間获茬,已是汗流浹背港庄。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工恕曲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佩谣。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像茸俭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子调鬓,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

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

  • 動態(tài)規(guī)劃三個重要性質: 最優(yōu)子結構 重疊子問題 無后效性(在構造解空間時一定要考慮) 一. 0/1背包 問題描述 ...
    ChongmingLiu閱讀 2,723評論 0 1
  • LeetCode Dynamic Programming DP 九章DP班歸納: 坐標型DP:保存的是坐標的狀態(tài)腾窝;...
    Deepin_閱讀 605評論 0 1
  • 動態(tài)規(guī)劃認知 ? 在問題滿足最優(yōu)性原理之后,用動態(tài)規(guī)劃解決問題的核心就在于填表虹脯,表填寫完畢驴娃,最優(yōu)解也就找到循集。 ...
    汝其母戲吾乎閱讀 1,600評論 0 1
  • 我在進行一些互聯(lián)網(wǎng)公司的技術筆試的時候婆硬,對于我來說最大的難題莫過于最后的那幾道編程題了奸例,這對算法和數(shù)據(jù)結構有一定程...
    檸檬烏冬面閱讀 19,890評論 2 19
  • 輕輕地向楼,你來了 輕輕地,我也來了 不必在意天邊的云彩 這里陽光恰好 有趣的靈魂如夜空 火花的綻放 點亮夜的眼 生命...
    流一盞燈閱讀 349評論 2 7