0-1背包算法

問題描述:

給定N中物品和一個(gè)背包。物品i的重量是Wi,其價(jià)值位Vi ,背包的容量為C减江。問應(yīng)該如何選擇裝入背包的物品,使得轉(zhuǎn)入背包的物品的總價(jià)值為最大捻爷?

在選擇物品的時(shí)候辈灼,對每種物品i只有兩種選擇,即裝入背包或不裝入背包也榄。不能講物品i裝入多次巡莹,也不能只裝入物品的一部分。因此甜紫,該問題被稱為0-1背包問題降宅。

問題分析:

令V(i,j)表示在前i(1<=i<=n)個(gè)物品中能夠裝入容量為就j(1<=j<=C)的背包中的物品的最大價(jià)值,則可以得到如下的動(dòng)態(tài)規(guī)劃函數(shù):

(1) V(i,0)=V(0,j)=0

(2) V(i,j)=V(i-1,j) j<wi
V(i,j)=max{V(i-1,j) ,V(i-1,j-wi)+vi) } j>wi

(1)式表明:如果第i個(gè)物品的重量大于背包的容量囚霸,則裝人前i個(gè)物品得到的最大價(jià)值和裝入前i-1個(gè)物品得到的最大價(jià)是相同的腰根,即物品i不能裝入背包;第(2)個(gè)式子表明:如果第i個(gè)物品的重量小于背包的容量拓型,則會(huì)有一下兩種情況:(a)如果把第i個(gè)物品裝入背包额嘿,則背包物品的價(jià)值等于第i-1個(gè)物品裝入容量位j-wi 的背包中的價(jià)值加上第i個(gè)物品的價(jià)值vi; (b)如果第i個(gè)物品沒有裝入背包瘸恼,則背包中物品價(jià)值就等于把前i-1個(gè)物品裝入容量為j的背包中所取得的價(jià)值。顯然册养,取二者中價(jià)值最大的作為把前i個(gè)物品裝入容量為j的背包中的最優(yōu)解东帅。

#include <stdio.h>
#include <algorithm>
int V[200][200];//前i個(gè)物品裝入容量為j的背包中獲得的最大價(jià)值

int KnapSack(int n,int w[],int v[],int x[],int C)
{
    int i,j;
    for(i=0;i<=n;i++)
        V[i][0]=0;
    for(j=0;j<=C;j++)
        V[0][j]=0;
    for(i=0;i<=n-1;i++)
        for(j=0;j<=C;j++)
            if(j<w[i])
                V[i][j]=V[i-1][j];
            else
                V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]);
            j=C;
            for(i=n-1;i>=0;i--)
            {
                if(V[i][j]>V[i-1][j])
                {
                x[i]=1;
                j=j-w[i];
                }
            else
                x[i]=0;
            }
            printf("選中的物品是:\n");
            for(i=0;i<n;i++)
                printf("%d ",x[i]);
            printf("\n");
        return V[n-1][C];
        
}

void main()
{
    int s;//獲得的最大價(jià)值
    int w[15];//物品的重量
    int v[15];//物品的價(jià)值
    int x[15];//物品的選取狀態(tài)
    int n,i;
    int C;//背包最大容量
    n=5;
    printf("請輸入背包的最大容量:\n");
    scanf("%d",&C);
    
    printf("輸入物品數(shù):\n");
    scanf("%d",&n);
    printf("請分別輸入物品的重量:\n");
    for(i=0;i<n;i++)
        scanf("%d",&w[i]);

    printf("請分別輸入物品的價(jià)值:\n");
    for(i=0;i<n;i++)
        scanf("%d",&v[i]);

    s=KnapSack(n,w,v,x,C);

    printf("最大物品價(jià)值為:\n");
    printf("%d\n",s); 
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市球拦,隨后出現(xiàn)的幾起案子靠闭,更是在濱河造成了極大的恐慌,老刑警劉巖刘莹,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阎毅,死亡現(xiàn)場離奇詭異,居然都是意外死亡点弯,警方通過查閱死者的電腦和手機(jī)扇调,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抢肛,“玉大人狼钮,你說我怎么就攤上這事〖裥酰” “怎么了熬芜?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長福稳。 經(jīng)常有香客問我涎拉,道長,這世上最難降的妖魔是什么的圆? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任鼓拧,我火速辦了婚禮,結(jié)果婚禮上越妈,老公的妹妹穿的比我還像新娘季俩。我一直安慰自己,他們只是感情好梅掠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布酌住。 她就那樣靜靜地躺著,像睡著了一般阎抒。 火紅的嫁衣襯著肌膚如雪酪我。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天挠蛉,我揣著相機(jī)與錄音祭示,去河邊找鬼。 笑死谴古,一個(gè)胖子當(dāng)著我的面吹牛质涛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掰担,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼汇陆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了带饱?” 一聲冷哼從身側(cè)響起毡代,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勺疼,沒想到半個(gè)月后教寂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡执庐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年酪耕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轨淌。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迂烁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出递鹉,到底是詐尸還是另有隱情盟步,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布躏结,位于F島的核電站却盘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏媳拴。R本人自食惡果不足惜黄橘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望禀挫。 院中可真熱鬧旬陡,春花似錦、人聲如沸语婴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砰左。三九已至匿醒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缠导,已是汗流浹背廉羔。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留僻造,地道東北人憋他。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓孩饼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親竹挡。 傳聞我的和親對象是個(gè)殘疾皇子镀娶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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