揹包問題 蠻力法,動態規劃

2021-09-18 03:00:42 字數 2760 閱讀 8936

給定重量分別為,價值分別為的n件物品,和乙個承重為w的揹包。求這些物品中乙個最有價值的子集,並能裝到揹包中。

揹包問題的蠻力解法是窮舉這些物品的所有子集,找出能夠裝到揹包中的所有子集,並在這些子集中找出價值最大的子集。

//揹包問題:蠻力法

#include

#include

#define maxx 9999

using

namespace std;

int n;

//貨物的總個數

int weight;

//揹包承受上限

int value =0;

//最大價值

int sum_w =0;

//重量

int sum_v =0;

//價值

int r[maxx]

;//儲存子集

int count;

struct node

;node pack[maxx]

;int

recursion

(int x)

//判斷最大價值

if(sum_v > value)}}

for(

int i=x;i

intmain()

recursion(0

);cout <<

"最大總價值的子集為: "

;for

(int i=

0;i) cout << endl <<

"最大總價值最大可以為: "

用weight陣列儲存每件物品的重量,value陣列來儲存每件物品的價值,用v[i][j]來表示i件物品在最大承受重量為j時的最大價值。

在揹包問題中我們要思考的主要是選不選擇這個物品。

對於乙個物品,只有兩種情況:

第i件不放進揹包,這時總價值為v[i-1][j];

第i件放進揹包,這時總價值為v[i][j-weight[i]]+value[i];

所以我們由此得出結論v[i][j] = max(v[i][j],v[i][j-weight[i]]+value[i]);

當揹包容量為0時,v[i][0]=0;

當物品數量為0時,v[0][j]=0;

當然,在我們考慮是否放進去時,是有前提的。即要考慮物品的重量以及揹包剩餘容量。

**演示:

#include

#include

#include

#define maxx 10000

using

namespace std;

int n;

//貨物的總數量

int w;

//揹包能承受的最大重量

int value[maxx]

;//記錄每件貨物的價值

int weight[maxx]

;//記錄每件貨物的重量

int v[maxx]

[maxx]

;//記錄一定承受重量對應的最大價值

int x[maxx]

;//記錄最大價值時有哪些物品

int num =0;

intmain()

//通過遍歷判斷第i+1件物品在最大承受重量為j時的最大價值

for(

int i =

0; i <= n; i++

)else

else

//當承受重量大於等於物品重量時,需要判斷之前的價值高還是把這個物品放進去後可以達到的價值高}}

}//記錄最大價值時有哪些物品

for(

int i = n, j = w; i >=

0; i--)}

//輸出

cout <<

"最大總價值的子集為: "

;for

(int i = num -

1; i >=

0; i--

) cout << endl <<

"最大價值為: "

<< v[n]

[w]<< endl;

return0;

}

執行結果如下:

當然,這個題也可以用一位陣列來做:

//揹包問題:動態規劃

#include

#include

#include

#define maxx 9999

using

namespace std;

int n;

int weight[maxx]

;int value[maxx]

;int w;

int v[maxx]

;int

main()

for(

int i=

1;i<=n;i++)}

cout <<

"最大價值為: "

<< v[w]

<< endl;

return0;

}

執行結果如下:

0 1揹包問題(蠻力法)

用蠻力法解決0 1揹包問題 例子輸入 4 6 5 43 4 2 31 1輸出 10 6 8 include include using namespace std intmain int w 5 v 5 int max 0 每輪最大價值 int max1 0 最終最大價值 int weight 0 ...

蠻力法解決0 1揹包問題

使用蠻力法解決0 1揹包問題,就是將所有的物品裝入揹包的可能全部列舉出來。這個可以通過遞迴的方式實現。遞迴的過程可以看成是對一棵樹的深度優先遍歷 例如上圖,假設從揹包中的1號物品開始列舉所有的可能。如果每一層僅僅簡單的在迴圈中使用遞迴,則該程式就不會結束。需要使用乙個一維向量用於標記當前哪些編號已經...

蠻力法求解0 1揹包問題C

先佔坑 include include 以下三個庫用於計算程式運算時間 include include include using namespace std define n 100 struct goods int n,bestvalue,cv,cw,c 物品數量,價值最大,當前價值,當前重量,...