問題描述:
給定n種物品和一揹包。物品i的重量是wi,其價值爲vi,揹包容量爲c。問應如何選擇裝入揹包中的物品,使得裝入揹包中物品的總價值最大。在選擇裝入揹包的物品時,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能將物品i裝入揹包多次,也不能只裝入部分的物品i。因此,該問題稱爲0-1揹包問題。
DP思想:
首先物品個數爲n個, 包總容量爲c, 其中w[],v[]分別爲n個物品的重量、價格。表m(i,j)表示從第i個物品開始容量爲j的包的最大價值量。具體流程如下:
1. 初始化,當i=n-1時,若c>=w[i],則m(i,c)=v[i];若0<=j<w[i],則m(i,c)=0
2. 當0<=i<n-1時,若j>=w[i],則m(i,j)=max{ m(i+1,j), m(i+1,j-w[i])+v[i] };若0<=j<w[i],則m(i,j)=m(i+1,j)
C++源碼:
運行結果: