0 1揹包問題(遞迴解決)

2021-07-11 23:59:21 字數 821 閱讀 4031

問題剖析:

0-1揹包問題規定每個物品要麼選,要麼不選。因此可以設定物品選擇向量為y=[y1,y2,…yn], 那麼當yn=1時,y'=[y1, y2, …yn-1],必然為f(n-1, c-wn)的物品選擇向量,當yn=0時,必然為f(n-1,c)的最優物品選擇向量。所以此時可以考慮動態規劃解法。

得到根據上面的分析,我們可以得到如下的遞迴式:

當wn>c時,f(n,c)=f(n-1,c);

當wn<=c時,f(n,c) = max(f(n-1,c), vn+f(n-1, c-wn) );

初始條件為:f(i, 0) = 0; f(0,i) = 0; f(0,0) = 0;

輸入**:

#include#include#includeusing namespace std;

int limitm;//限制的總重量

int option[100];

int n;//物品種數

struct bag

num[100];

int find(int n, int m)

else

else

else}}

}}int main()

cout<

cin>>limitm;

cout<

執行截圖:

總結:練了幾次,終於會用揹包演算法解決問題了!



01揹包 (遞迴解決)

01揹包,設定乙個揹包,他有乙個maxweight,現在你有n個物品,每個物品都有重量與其價值,現在要你求取得的最大價值。運用遞迴的思想,假如現在是從最後乙個開始選,如果這個東西的重量大於揹包的重量,那是不是可以從第n 1個物體開始選。假如這個東西的重量小於揹包的重量,那麼現在你將面臨兩個選擇,一不...

回溯法解決0 1揹包問題 遞迴

include include include using namespace std typedef struct thing thing things const int goods 7 物品的數量 int max weigth 150 揹包承受的重量 int information 2 goo...

01揹包問題 遞迴實現

問題描述 乙個揹包裡可以放入重量為 weight 的物品,現有 n 件物品的集合 s,其中物品的重量分別為 w0,w1.求解 假設如果不選最後一件物品 其重量是 如果選擇最後一件物品,那麼如果 def knap weight,wlist,n weight為包的容量,wlist是乙個所有重量的表,n為...