演算法 01揹包

2021-10-02 10:18:55 字數 3120 閱讀 2408

揹包最大容量10,有以下5個商品及其價值,試求揹包所能容納的最大價值。序號1

2345

重量226

54價值6

3546

**如下:

#include

#include

#define max_v 100

using

namespace std;

struct good

;/* 動態規劃求解

* n: 商品個數

* m: 揹包最大重量

* s: 乙個二維陣列, s[i][j]表示考慮前i個商品在揹包容量為j的情況下的最大價值。

* */

void

done

(good goods,

int n,

int m,

int s[max_v]

[max_v]

)else}}

}/*追蹤最優解*/

void

trace

(good goods,

int n,

int m,

int s[max_v]

[max_v]

) n --;}

}int

main()

,,,,

};int s[max_v]

[max_v]=;

done

(goods,5,

10, s)

; cout <<

"max:"

<< s[5]

[10]<< endl;

trace

(goods,5,

10, s)

;return0;

}

**如下:

#include

using

namespace std;

struct good

;/* n : 商品個數

* i : 回溯層次

* m : 最大容量

* v : 當前價值

* buf : 解的緩衝區

* solve : 問題最優解, 是乙個01向量

* maxp : 問題最優解的值

* */

void

done

(good goods,

int i,

int n,

int m,

int v,

int buf,

int solve,

int& maxp)

}return;}

//不裝

buf[i]=0

;done

(goods, i +

1, n, m, v, buf, solve, maxp)

;//裝

if(goods[i]

.w <= m)

}int

main()

,,,,

};int buf[5]

=;int solve[5]

=;int maxp =0;

done

(goods,0,

5,10,

0, buf, solve, maxp)

; cout <<

"solve: "

;for

(int i =

0; i <

5; i++

) cout << endl <<

"solve-value:"

<< maxp << endl;

return0;

}

**如下:

#include

#include

#include

#include

#include

#define max_v 256

using

namespace std;

struct node};

struct cmp};

/* 計算價值上界

* i : 當前搜尋層次

* m : 揹包剩餘容量

* */

intbound

(int ws,

int vs,

int i,

int n,

int m)

return v;

}/* 0-1揹包問題

* ws : 物品的重量

* vs : 物品的價值

* n : 物品的個數

* m : 揹包最大容量

* */

node*

bagging

(int ws,

int vs,

int n,

int m)

if(temp-

>v +

bound

(ws, vs, temp-

>l, n, m - temp-

>w)

> max_w)

else}}

}}//注意:這裡為了簡化,故沒有清除所有new出的物件。

}/*構造最優解*/

void

traceback

(node* node)

else

node = node-

>p;

}for

(int i = s.

size()

-1; i >=

0; i--

) cout << endl;

}int

main()

;//按照單位重量價值遞減排序

int vs=

;int n =

5, m =10;

node* solve =

bagging

(ws, vs, n, m)

; cout <<

"solve_value: "

<< solve-

>v << endl;

cout <<

"solve: "

;traceback

(solve)

;return0;

}

01揹包演算法

核心 狀態轉換方程 01揹包問題 容量為10的揹包,有5種物品,每種物品只有乙個,其重量分別為5,4,3,2,1,其價值分別為1,2,3,4,5。設計演算法,實現揹包內物品價值最大。如下 輸出14 include include using namespace std int main int v ...

01揹包演算法

01揹包問題 動態規劃的基本思想 動態規劃演算法可分解成從先到後的4個步驟 1.描述乙個最優解的結構,尋找子問題,對問題進行劃分。2.定義狀態。往往將和子問題相關的各個變數的一組取值定義為乙個狀態。某個狀態的值就是這個子問題的解 若有k個變數,一般用k維的陣列儲存各個狀態下的解,並可根 據這個陣列記...

演算法(揹包問題 01揹包問題)

01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...