揹包問題的C語言實現

2021-08-30 18:12:16 字數 2461 閱讀 2038

假設有乙個揹包的負重最多可達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時,其解空間是 定義了問題的解空間後,還應將解空間很好的組織起來...