揹包問題

說明假設有一個揹包的負重最多可達8公斤,而希望在揹包中裝入負重範圍內可得之總價物
品,假設是水果好了,水果的編號、單價與重量如下所示:
0 李子4KG NT$4500
1 蘋果5KG NT$5700
2 橘子2KG NT$2250
3 草莓1KG NT$1100

4 甜瓜6KG NT$6700

解法揹包問題是關於最佳化的問題,要解最佳化問題可以使用「動態規劃」(Dynamic
programming),從空集合開始,每增加一個元素就先求出該階段的最佳解,直到所有的元素加
入至集合中,最後得到的就是最佳解。

以揹包問題爲例,我們使用兩個陣列value與item,value表示目前的最佳解所得之總價,item表
示最後一個放至揹包的水果,假設有負重量1~8的揹包8個,並對每個揹包求其最佳解。

 

以該問題爲例解釋解法爲:

從空集開始,增加第一種水果到集合,算出當前集合中揹包負重1~8KG的最大價值,即刷新value數組值;

增加第二種水果到集合,刷新value數組值;……第五種水果...

 

更新value數組第j個元素的條件簡要描述:第i種水果,其佔用負重的大小爲Size(i),其價值爲Price(i),則放入第i個水果的負重最大價值=Price(i)+value[j-Size(i)]。

若該值大於當前value[j],則設置value[j]=Price(i)+value[j-Size(i)]。

實現代碼:

// 揹包問題.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"

#define N 8

typedef struct Tag_Object
{
    char* name;
    int size;
    int price;
}Object;

int _tmain(int argc, _TCHAR* argv[])
{
    int value[N+1] ={0};
    int item[N+1] ={0};
    Object objList[]={{"A",4,4500},
        {"B",5,5700},
        {"C",2,2250},
        {"D",1,1100},
        {"E",6,6700}
    };
    int tmp;
    int newValue;
    int i;
    int j;

    for (i=0; i<sizeof(objList)/sizeof(objList[0]); i++)
    {
        for (j=objList[i].size; j<N+1; j++)
        {
            tmp = j-objList[i].size;
            newValue = value[tmp]+objList[i].price;
            if (newValue > value[j])
            {
                value[j] = newValue;
                item[j] = i;
            }
        }
    }

    printf("合計\t%d\n", value[N]);
 return 0;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章