假設有乙個揹包的負重最多可達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 2
3 4
5 6
7 8
value
0 0
0 4500
4500
4500
4500
9000
item
- -
- 0
0 0
0 0
揹包負重
1 2
3 4
5 6
7 8
value
0 0
0 4500
5700
5700
5700
9000
item
- -
- 0
1 1
1 0
揹包負重
1 2
3 4
5 6
7 8
value
0 2250
2250
4500
5700
6750
7950
9000
item
- 2
2 0
1 2
2 0
揹包負重
1 2
3 4
5 6
7 8
value
1100
2250
3350
4500
5700
6800
7950
9050
item
3 2
3 0
1 3
2 3
揹包負重
1 2
3 4
5 6
7 8
value
1100
2250
3350
4500
5700
6800
7950
9050
item
3 2
3 0
1 3
2 3
由最後乙個**,可以得知在揹包負重8公斤時,最多可以裝入9050元的水果,而最後乙個裝入的水果是3號,也就是士多啤梨,裝入了士多啤梨,揹包只能再放入7公斤(8-1)的水果,所以必須看揹包負重7公斤時的最佳解,最後乙個放入的是2號,也就是橘子,現在揹包剩下負重量5公斤(7-2),所以看負重5公斤的最佳解,最後放入的是1號,也就是蘋果,此時揹包負重量剩下0公斤(5-5),無法再放入水果,所以求出最佳解為放入士多啤梨、橘子與蘋果,而總價為9050元。
c語言實現
#include #include #define limit 8 // 重量限制#define n 5 // 物品種類
#define min 1 // 最小重量
struct body ;
typedef struct body object;
int main(void) ;
int value[limit+1] = ;
int newvalue, i, s, p;
object a = ,
, ,
, };
for(i = 0; i < n; i++)
} }
printf("物品\t**\n");
for(i = limit; i >= min; i = i - a[item[i]].size)
printf("合計\t%d\n", value[limit]);
return 0;
}
各種揹包問題動態規劃 C語言實現
首先,需要設定乙個二維陣列t,其中t i j 表示利用前i個物品來裝進容量為j的揹包的所能夠獲得的最大價值。當只考慮第i件物品時,可將情況分為是否放入第i件物品兩種 1.01揹包 每個物品僅有乙個 不放第i件物品 t i j t i 1 j 放入第i件物品 t i j t i 1 j weights...
0 1揹包(Java語言實現)
核心 if j w i value i j math.max value i 1 j value i 1 j w i v i else value i j value i 1 j i是遍歷所有物品,當前所指的物品 j是當前揹包剩餘容量 value是存放動態規劃資料的陣列,用以記錄已經得到的資料,便於...
01揹包問題(用c語言實現) 回溯法求解
回溯法求解01揹包 用回溯法解問題時,應明確定義問題的解空間。問題的解空間至少應包含問題的乙個 最優 解。例如,對於有n種可選擇物品的0 1揹包問題,其解空間由長度為n的0 1向量組成。該解空間包含對變數的所有可能的0 1賦值。當n 3時,其解空間是 定義了問題的解空間後,還應將解空間很好的組織起來...