問題剖析:
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為...