給定n種物品和一揹包,揹包的載重量為c 。設物品i的重量是wi,其價值為pi。每件物品要麼整體裝入揹包,要麼不裝,不能拆開裝。問應如何選擇裝入揹包的物品,使得裝入揹包中的物品的總重量不超過c、總價值最大?
建立數學模型:
可用xi表示第i個物品是否裝入揹包: xi =1,表示裝入 ; xi =0,表示不裝入。乙個裝包方案表示為乙個n維向量:(x1,x2,…, xn)
2.考慮0-1揹包問題的子問題:揹包容量為j,可選物品的範圍為:i,i+1,…,n 。其最優值定義 為:m(i,j),可知:原問題的最優值為m(1,c)
求解m(i,j)演算法如下:
若j=wi, 取如下二種情形的最大值:
不裝:m(i,j)= m(i+1,j)
裝入:m(i,j)= m(i+1,j- wi)+pi
下面是逆推法的一種寫法
#include
using
namespace std;
#define n 50
int n,w[
100]
,p[100
],c,m[
100]
[100];
voidmm(
)for
(i=n-
1; i>=
1; i--)}
}void
show()
}if(m[1
][c]
-sp==p[n]
) cout<<
"w="
<" ,pmax="
<}int
main()
mm();
show()
;}
這個是順推法的寫法
#include
using
namespace std;
intmain()
for(j=
0;j<=c;j++
)for
(i=2
;i<=n;i++)}
cw=c;
cout<<
"揹包所裝的物品: "
(" i w(i) p(i)\n");
for(sp=
0,sw=
0,i=n;i>=
2;i--)}
if(m[n]
[c]>sp)
printf
("w=%d, pmax=%d \n"
,sw,sp)
;}
0 1揹包(動態規劃解法)
動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每乙個解都對應於乙個值,我們希望找到具有最優值的解。動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的...
01揹包問題的動態規劃解法
參考 問題描述 給定n中物品和乙個揹包。物品i的重量是wi,其價值位vi 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0 1揹包問...
動態規劃01揹包問題之跳躍點解法
m i j ma xm i,j max m i,j max m i j 代 表餘量j 從第乙個 物品到第 i個物品 的最優價 值m i,j 代表餘量j從第乙個物品到第i個物品的最優價值 m i,j 代表餘量 j從第一 個物品到 第i個物 品的最優 價值p i 代表m i,j 的跳躍 點點 集p i ...