動(dòng)態(tài)規(guī)劃 背包問題

1.問題描述

有n個(gè)物體有重量和價(jià)值兩個(gè)屬性猎拨,一個(gè)能承重一定重量的背包。問怎么選擇物體能實(shí)現(xiàn)背包里的價(jià)值最大化。

2.問題具體化

假設(shè)有5個(gè)物體和一個(gè)背包鹤盒。物體的重量分別是2百炬、2褐隆、6、5剖踊、4庶弃,即w[]={0、2德澈、2歇攻、6、5梆造、4}缴守,價(jià)值分別是6、3、5屡穗、4贴捡、6,即v[]={0村砂、6烂斋、3、5础废、4汛骂、6}。背包承重為10评腺。問怎么選擇香缺,能實(shí)現(xiàn)背包所背物體價(jià)值的最大化。

3. 解決過程

利用二維表格歇僧,通過自左向右图张、自下向上的計(jì)算,來繪制表格诈悍,左后再在表格的基礎(chǔ)上選擇最優(yōu)解祸轮。

  • 3.1表格最后一行

對(duì)最后一行的物體4來說,只有兩種情況侥钳,要么裝入背包适袜,要么不裝入。物體5的的重量是4舷夺。也就是說在背包承重為0--3的時(shí)候物體5是裝不進(jìn)去的苦酱,所以背包為0,當(dāng)背包承重為4--10的時(shí)候给猾,物體5可以裝進(jìn)去疫萤,又因?yàn)槲矬w5的價(jià)值為6,所以背包價(jià)值為6敢伸。

|.|0|1|2|3|4|5|6|7|8|9|10|
|--
|1
|2
|3
|4|
|5|0|0|0|0|6|6|6|6|6|6|6|

  • 3.2表格倒數(shù)第二行

    表格倒數(shù)第二行的計(jì)算思路與倒數(shù)第一不一樣扯饶,因?yàn)槲覀円紤]背包里已經(jīng)有的物體。因?yàn)槲矬w4的重量為5池颈。所以在背包承重為0--4的情況下即使空包也裝不進(jìn)去尾序,所以不能裝入,包里原本是多少價(jià)值躯砰,就還是多少價(jià)值每币。在背包承重為5--8的時(shí)候,物體4可以裝進(jìn)去琢歇,但是物體5要拿出來才行兰怠,這樣的話背包的價(jià)值就變成4了梦鉴,小于6。所以能然選擇不把物體4放進(jìn)去痕慢。在背包承重為9--10的時(shí)候尚揣,兩個(gè)都可以放進(jìn)去,所以背包的價(jià)值變成10了掖举。

|.|0|1|2|3|4|5|6|7|8|9|10|
|--
|1
|2
|3
|4|0|0|0|0|6|6|6|6|6|10|10|
|5|0|0|0|0|6|6|6|6|6|6|6|

  • 3.3最終計(jì)算出來的表格

其他行的計(jì)算過程同上快骗,最終結(jié)果如下。

|.|0|1|2|3|4|5|6|7|8|9|10|
|--
|1|0|0|6|6|9|9|12|12|15|15|15|
|2|0|0|3|3|6|6|9|9|9|10|11|
|3|0|0|0|0|6|6|6|6|6|10|11|
|4|0|0|0|0|6|6|6|6|6|10|10|
|5|0|0|0|0|6|6|6|6|6|6|6|

  • 3.4表格計(jì)算公式

max( m(i+1,j) , m(i+1,j-wi)+vi )

  • 3.5做出最優(yōu)選擇

大體思想:我們從右上角(坐標(biāo)(1,10))開始塔次,看(1,10)與(2,10)的值是不是一樣方篮,一樣,則說明物體1沒裝進(jìn)去励负,不一樣藕溅,則說明物體1裝進(jìn)去了。
void opt_way(int flag[],int w[], int table[num][weight])
{
int n = weight-1;
for (size_t i = 0; i < num; i++)
{
if (table[i][n]==table[i+1][n])
{
flag[i] = 0;
}
else
{
flag[i] = 1;
n = n - w[i+1];
}
}
}


4.完整代碼

#include <iostream>
#define num 5
#define weight  11
using namespace std;

void init_table(int table[num][weight])
{
    for (size_t i = 0; i < num; i++)
    {
        for (size_t j = 0; j < weight; j++)
        {
            table[i][j] = 0;
        }
    }

}
void show_table(int table[num][weight])
{
    for (size_t i = 0; i < num; i++)
    {
        for (size_t j = 0; j < weight; j++)
        {
            cout <<table[i][j] << "\t";
        }
        cout << "\n";
    }

}
void creat_table(int table[num][weight],int w[],int v[])
{
    //給最后一行賦初值
    for (size_t i = 0; i < weight; i++)
    {
        if (w[num] > i)
            table[num - 1][i] = 0;
        else
        {
            table[num - 1][i] = v[num];
        }
    }
    //在最后一行基礎(chǔ)上給每行賦值
    for (int i = num - 1; i > 0; i--)
    {
        for (int j = 0; j < weight; j++)
        {
            if (w[i]>j)
            {
                table[i - 1][j] = table[i][j];
            }
            else if ((v[i] + table[i][j-w[i]])>table[i][j])
            {
                table[i-1][j] = v[i] + table[i ][j - w[i]];
            }
            else
            {
                table[i-1][j] = table[i][j];
            }
        }
    }

}



void opt_way(int flag[],int w[], int table[num][weight])
{
    int n = weight-1;
    for (size_t i = 0; i < num; i++)
    {
        if (table[i][n]==table[i+1][n])
        {
            flag[i] = 0;
        }
        else
        {
            flag[i] = 1;
            n = n - w[i+1];
        }
    }

}
int main()
{
    int w[num+1] = {0,2,2,6,5,4};
    int  v[num+1]= {0,6,3,5,4,6};
    int flag[num] = { 0, 0, 0, 0, 0 };
    int table[num][weight];
    init_table(table);
    creat_table(table,w,v);
    opt_way(flag,w,table);
    //----------------
    show_table(table);
    //------------------------------
    for (size_t i = 0; i < num; i++)
    {
        cout << flag[i];
    }
    getchar();
    return 0;
}

5.程序結(jié)果截圖

11001是最優(yōu)的選擇
11001是最優(yōu)的選擇
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末继榆,一起剝皮案震驚了整個(gè)濱河市巾表,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌略吨,老刑警劉巖集币,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異翠忠,居然都是意外死亡鞠苟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門秽之,熙熙樓的掌柜王于貴愁眉苦臉地迎上來当娱,“玉大人,你說我怎么就攤上這事考榨】缦福” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵董虱,是天一觀的道長扼鞋。 經(jīng)常有香客問我,道長愤诱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任捐友,我火速辦了婚禮淫半,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匣砖。我一直安慰自己科吭,他們只是感情好昏滴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著对人,像睡著了一般谣殊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牺弄,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天姻几,我揣著相機(jī)與錄音,去河邊找鬼势告。 笑死蛇捌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咱台。 我是一名探鬼主播络拌,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼回溺!你這毒婦竟也來了春贸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤遗遵,失蹤者是張志新(化名)和其女友劉穎萍恕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓮恭,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雄坪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屯蹦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片维哈。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖登澜,靈堂內(nèi)的尸體忽然破棺而出阔挠,到底是詐尸還是另有隱情,我是刑警寧澤脑蠕,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布购撼,位于F島的核電站,受9級(jí)特大地震影響谴仙,放射性物質(zhì)發(fā)生泄漏迂求。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一晃跺、第九天 我趴在偏房一處隱蔽的房頂上張望揩局。 院中可真熱鬧,春花似錦掀虎、人聲如沸凌盯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驰怎。三九已至阐滩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間县忌,已是汗流浹背掂榔。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芹枷,地道東北人衅疙。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鸳慈,于是被迫代替她去往敵國和親饱溢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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

  • 本篇博文參考此博文走芋,該博文PPT非常有助理解 問題描述:給定n種物品和一背包绩郎。物品i的重量是wi,其價(jià)值為vi翁逞,背...
    icecrea閱讀 1,485評(píng)論 0 4
  • 動(dòng)態(tài)規(guī)劃 之 0-1背包問題 【背包問題】 現(xiàn)有n個(gè)物品肋杖,價(jià)值為`$$v_1,v_2....v_n$$ 重量為 現(xiàn)...
    siriusing閱讀 229評(píng)論 0 0
  • 前幾天錢包的卡扣壞了状植,當(dāng)時(shí)就想到換錢包的念頭,是時(shí)候該給錢換個(gè)舒服的家了怨喘。隱約記得在哪里看過津畸,說用錢包最好用長的,...
    糖小煒閱讀 306評(píng)論 0 0
  • 健康并不是被創(chuàng)造出來的必怜,它或者被疾病隱藏起來肉拓,或者當(dāng)沒有病的時(shí)候它自己就顯露出來了。健康己經(jīng)在我們里面梳庆,健...
    婉緣閱讀 288評(píng)論 0 0
  • 夏天披薩 和 時(shí)光鋪?zhàn)拥木?/div>
    Kodel閱讀 159評(píng)論 0 0