設有乙個揹包可以放入的物品重量為s,現有n件物品,重量分別為w1,w2,w3,……,wn。問:能否從這n件物品中選擇若干件放入次揹包,使得放入的重量之和正好為s。如果存在一種符合上述要求的選擇,則稱此揹包問題有解(或稱解為「真」),否則此問題無解(或解為「假」)。
演算法設計:遞迴列舉
揹包問題3與揹包問題1,2的根本差別在於:揹包問題1所選的物品件數是固定的常量,備選物品件數可以是可知的變數;揹包問題2備選物品件數是固定常量且較小,所選物品件數不定;而揹包問題3備選物品件數是可知的變數,所選物品件數也是不定的。因此揹包問題3沒有可以用固定的(常量個)巢狀迴圈來列舉的物件。這種情況可以用遞迴演算法來解決。
c++**:
#include
#include
using
namespace
std;
//如果能在sz件物品中選擇若干件物品放入揹包,使揹包的重量正好為w,則返回true,否則返回false
bool fun(int w, vector
&v, int sz)
else
if (w < 0)
else
/*return fun(w-v[sz-1], v, sz-1) || fun(w, v, sz-1);*/
if ( fun(w-v[sz-1], v, sz-1) )
else
return fun(w, v, sz-1);
}}int main()
int sz = v.size();
if(fun(w,v,sz))
執行結果:
揹包問題3(多重揹包)
基於上次說的01揹包和完全揹包,揹包三連發還有最後乙個 多重揹包 什麼事多重揹包,很簡單就是把01揹包和完全揹包結合起來的新揹包問題就叫做多重揹包。有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容...
揹包問題之01揹包問題
題目 有n件物品和乙個容量為v的揹包。第i件物品的容量是c i 價值為w i 求解將哪些物品裝入揹包可以使得這些物品的費用總和不超過揹包容量,且價值總和最大。基本思路 作為最基礎的揹包問題,特點是 每種物品只有一件,可以選擇放或者是不放。用子問題定義狀態 f i v 表示前i件物品恰好放入乙個容量為...
揹包問題之01揹包
01揹包就是說針對每一件物品,有選擇裝入或者放棄,是屬於動態規劃類的問題。現在假設我們有m件物品,各有價值,揹包承重為10,假設當前可用的承重量為v,當前在抉擇第m件物品是否放入,重量為w1,價值為v1,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...