[cpp]view plain
copy
/**簡單揹包問題
問題定義:
有乙個揹包重量是s,有n件物品,重量分別是w0,w1...wn-1
問能否從這n件物品中選擇若干件放入揹包中使其重量之和正好為s
*/#include
#include
#include
#include
using
namespace
std;
const
intmaxsize=100;
intn,s;
//n是有多少中物品,s是要湊足的重量
bool
visit[maxsize];
//標記是否被訪問過,別訪問過標記為1,沒有訪問過為0
intw[maxsize];
//記錄每一種物品的重量
intq[maxsize];
//相當於乙個棧,儲存被訪問過的物品的編號
intbeibao()
} //如果檢索到最後,也就是說棧頂前面的物品都不符合條件
//因此可能棧內的元素有問題,所以彈出棧頂元素,不把棧頂元素計算在內
if(i==n)
} } //揹包問題遞迴版本
/**解釋:其選擇只有兩種可能,選擇一組物品中包含wn-1 ,此時knap(s,n)的解就是knap(s - wn-1,n-1)的解
如果選擇的物品中不包括wn-1,這樣knap(s,n)的解就是knap(s,n-1)的解
knap(s,n) = true, 當 s=0時
false ,當s < 0 或者 s > 0 且 n < 1
knap(s - wn-1,n-1) || knap(s,n-1) 當s>0且n>=1
*/bool
knap(
ints,
intn)
else
return
knap(s,n - 1);
} int
main()
intt=beibao();
knap(s,n);
if(t!=-1)
else
cout<<-1<
}
簡單的揹包問題 非遞迴和遞迴
問題描述 從一堆物品中選出滿足特定要求的數個物品,求方案 從重量1 4 4 5 7的5個物品中選出數個,要求總重量為10 分析 略 遞迴演算法 int knap int w,int t,int n stack void init stack s int isempty stack s void pu...
0 1揹包的遞迴解法
1 輸入物品個數n,揹包容量w 2 定義物品價值列表v,物品體積列表w 3 def rec i,j 從第i個物品開始挑選總重小於j的部分 4 res 0 5 if i n 剩餘物品為0 6 return res 7 elif j w i 無法挑選該物品 8 res rec i 1,j 9 else ...
揹包問題的非遞迴演算法
const int m 12 揹包重m斤 int subjects 物件陣列,重量 價值 int currentweight 0,currentvalue 0 當前重量,當前價值 int maxvalue 0 最優價值 for int i 0 i subjects.getupperbound 0 1...