揹包問題的動態規劃演算法

2021-03-04 08:12:09 字數 2080 閱讀 3323

1. u1=c

2. m=n+1時,fm(u)恒為0

3. u<=0時,fm(u)為0

狀態轉移方程為u(k+1)=uk-xk*wk。

動態規劃基本方程為:wm>u時,fm(u)=f(m+1)(u),否則fm(u)為f(m+1)(u與f(m+1)(u-wm)+pm中的較大者。

定義(n+1)*c矩陣f,其m行u列處為fm(u);(n+1)*c矩陣x,其m行u列處為剩餘容量為u,剩餘物品編號為m到n時xm的取值。

%n,c,w,p的值是自定義的

n=6;

c=10;

w=[1,2,3,4,5,6];

p=[6,5,4,3,2,1];

cishu=0;

tic;

f=zeros(n+1,c);

x=zeros(n+1,c);

y=zeros(1,n);

for m=n:-1:1

for u=1:c

if w(m)>u

f(m,u)=f(m+1,u);x(m,u)=0;

cishu=cishu+3;

elseif w(m)if f(m+1,u)>(f(m+1,u-w(m))+p(m))

f(m,u)=f(m+1,u);x(m,u)=0;

cishu=cishu+4;

elseif f(m+1,u)<(f(m+1,u-w(m))+p(m))

f(m,u)=f(m+1,u-w(m))+p(m);x(m,u)=1;

cishu=cishu+4;

else

f(m,u)=f(m+1,u);x(m,u)=-1;

cishu=cishu+4;

end else

if f(m+1,u)>p(m)

f(m,u)=f(m+1,u);x(m,u)=0;

cishu=cishu+4;

elseif f(m+1,u)f(m,u)=p(m);x(m,u)=1;

cishu=cishu+4;

else

f(m,u)=f(m+1,u);x(m,u)=-1;

cishu=cishu+4;

end end

endendt=toc

cishu

%以下迴圈是根據x矩陣取出乙個最優解

for i=1:n

u=abs(y)*w';

if c>u

y(i)=x(i,c-u);

else

y(i)=0;

endendmax=f(1,c)

y本例輸出為

t = 1.1769e-004

cishu =225

max =18

y =1 1 1 1 0 0

t表示運算時間,cishu表示比較、賦值操作的次數,max表示最大價值,y的i分量表示i物品的取捨,0表示不放入揹包,1表示放入揹包,-1表示都可以。(輸出的y只給出了一種可能的結果。改變給y賦值的那個迴圈中指標i的變化方式,可以得到其他可能的結果)

複雜度分析:演算法的實現部分在於二重for迴圈。共有n*c次迴圈,最壞情形下,每次迴圈需要2次比較,2次賦值,7次加減(由於既有指標加1,又有矩陣係數的加法,所以以上程式沒有統計加減次數),所以總運算次數不超過11*n*c,即其複雜度為o(n*c)。

[1] 王樂, 王世卿, 張靜樂. 基於 matlab 的 0—1 揹包問題的動態規劃方法求解[j]. 計算機技術與發展, 2006, 16(4): 88-89.

[2] 郭曉暉. 遺傳演算法在求解揹包問題中的應用[j]. 大連鐵道學院學報, 2001, 22(3): 32-35.

[3] 黃波, 蔡之華. 0/1 揹包問題及其解法研究[j]. 電腦知識與技術: 學術交流, 2007 (4): 229-231.

[4] martello s, toth p. knapsack problems[m]. new york: wiley, 1990.

[5] toth p. dynamic programming algorithms for the zero-one knapsack problem[j]. ***puting, 1980, 25(1):

29-45.

動態規劃演算法

首先,我們來觀察一下這個演算法。在求從b1到e的最短距離的時候,先求出從c2到e的最短距離 而在求從b2到e的最短距離的時候,又求了一遍從c2到e的最短距離。也就是說,從c2到e的最短距離我們求了兩遍。同樣可以發現,在求從c1 c2到e的最短距離的過程中,從d1到e的最短距離也被求了兩遍。而在整個程...

5動態規劃演算法習題答案

1 最大子段和問題 給定整數序列,求該序列形如的子段和的最大值 1 已知乙個簡單演算法如下 int maxsum int n,int a,int best i,int bestj return sum 試分析該演算法的時間複雜性。2 試用分治演算法解最大子段和問題,並分析演算法的時間複雜性。3 試說...

實驗二動態規劃演算法的應用

一 實驗目的 2 二 實驗內容 2 2.1數塔問題 2 2.2 最長單調遞增子串行問題 2 三 演算法設計 2 3.1 數塔問題 2 3.1.1演算法描述 2 3.1.2 函式設計 3 3.2 最長單調遞增子串行問題 3 3.1.1演算法描述 3 3.1.2 函式設計 3 四.程式除錯及執行結果分析...