說明假設有一個揹包的負重最多可達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;
}