0-1揹包問題:有乙個揹包最多能裝**積為volume的東西,volume為一正整數。有number件物品,第j件物品重weight[j],價值value[j],其中1
部分揹包問題:在0-1揹包問題中,如果某件物品可以帶走一部分,那麼我們稱該問題是部分揹包問題。
部分揹包問題可以用貪心演算法求解,也就是每次都帶走單位價值最高的物品,但是0-1揹包問題則不能用貪心演算法來求解。例如有乙個揹包容量是5,有3件物品,重量分別是1,2,3;價值分別是60,100,120,;如果按照貪心演算法來求解,那麼就帶走第1,2,兩件物品,總價值是160,但是最大價值其實是220,也就是應該帶走第2,3兩件物品。
下面我們用動態規劃和深度優先遍歷兩種方法來求解0-1揹包問題。
法1:動態規劃法
#includeusing namespace std;
//動態規劃法解0-1揹包問題
int knapsack(int* weight,int* value,int number,int volume)
else
}}
} cout<=0)
深度優先遍曆法:
我們利用深度優先遍歷至每個葉子節點,求出a,b,c,d的全部組合,然後選出價值最大的方案。
解答樹如下所示:
其中0表示放入,1表示不放。
#includeusing namespace std;
const int n=100;
int ans=0;//利用全域性變數ans儲存解
int item_number;//物品件數
int knap_size;//揹包大小
int weight[n]; //物品重量
int value[n];//物品價值
int x[n];//解向量
void dfs(int cur_depth,int cur_size,int cur_value)
if(cur_size>knap_size)
if(cur_value>ans)
ans=cur_value;
x[cur_depth]=0;
dfs(cur_depth+1,cur_size,cur_value);//第cur_depth物品不取
x[cur_depth]=1;
dfs(cur_depth+1,cur_size+weight[cur_depth],cur_value+value[cur_depth]);//第cur_depth物品取
}int main()
cout
} cout
dfs(0,0,0);//呼叫dfs函式
cout<
例子:
揹包問題 01揹包問題
n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...
揹包問題 01揹包
有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...
揹包問題(01揹包)
1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...