給定重量分別為,價值分別為的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 物品數量,價值最大,當前價值,當前重量,...