初識動態規劃 Dynamic Program

2021-09-28 17:09:54 字數 2532 閱讀 8193

0-1揹包問題:對於一組不同重量、不可分割的物品,物品有n個,選擇一些物品裝入揹包,在滿足揹包最大承重w的前提下求出揹包的最大重量。

這個問題可以用回溯演算法實現,可以參考《回溯演算法》這一篇,也可以使用動態規劃的思想去解決。

所謂動態規劃,簡單說就是把乙個問題分為多個階段,每個階段對應乙個決策y or n,使用乙個狀態陣列記錄記錄每乙個階段的狀態,根據當前階段的狀態陣列,推導出下乙個階段的狀態陣列,動態地向前推進。

對於揹包問題就是,將問題分為n個階段,n表示物品個數,每個階段都會決策這個物品是否要放入揹包中:放入或者不放入。決策執行之後,揹包中的物品重量就會出現多種狀態,對應到遞迴樹中就是就是有很多不同節點。我們把遞迴樹每一層中重複的節點合併,只記錄不同的狀態,然後基於上一層的狀態陣列,推導出下一階段的狀態陣列。每一層中的狀態個數最多為w個即揹包的承重。使用二維陣列states[n][w+1]表示狀態陣列,記錄每個物品決策執行後可以達到的不同狀態。

這裡例子中物品重量為陣列:[2,2,4,6,3].

* 物品個數

*/private

int n =5;

/** * 揹包承受的最大重量

*/private

int w =9;

/** * weight: 物品重量,n: 物品個數,w: 揹包可承載重量

*/public

intf

(int

weight,

int n,

int w)

// 動態規劃狀態轉移

for(

int i =

1; i < n;

++i)

}// 把第 i 個物品放入揹包

for(

int j =

0; j <= w-weight[i]

;++j)}}

// 輸出結果

for(

int i = w; i >=0;

--i)

}return0;

}時間複雜度從**的兩層迴圈中可以看出o(n*w),n表示物品個數,w表示總承重。

空間複雜度因為要申請乙個n乘以w+1的二維陣列,所以記憶體消耗比較大,所以是空間換時間的思路,不過可以優化。

就是使用乙個一維陣列來代替二維陣列。

優化**如下:

/**

* 動態規劃空間複雜度優化(相對於上邊的f函式)

* @param weight: 物品重量 [2,2,4,6,3],n: 物品個數,w: 揹包可承載重量 9

* @return

*/public

intf2

(int

weight,

int n,

int w)

// 動態規劃

for(

int i =

1; i < n;

++i)}}

// 輸出結果

for(

int i = w; i >=0;

--i)

}return0;

}

在考慮揹包總承重下物品最大重量的前提下,再加入乙個物品的價值,計算最終的揹包中可以容納的最大總價值是多少?

**:

/**

物品的總價值

*/private

int[

] value =

;/**

* 在考慮物品價值的情況下,計算在承重限制條件下的揹包中最大總價值

* @param weight 物品總量陣列

* @param value 物品價值陣列

* @param n 物品個數

* @param w 揹包承重

* @return

*/public

intsuperf

(int

weight,

int[

] value,

int n,

int w)

} states[0]

[0]=

0;if(weight[0]

<= w)

// 動態規劃,狀態轉移

for(

int i =

1; i < n;

++i)

}// 選擇第 i 個物品

for(

int j =

0; j <= w - weight[i]

;++j)}}

}// 找出最大值

int maxvalue =-1

;for

(int j =

0; j <= w;

++j)

}return maxvalue;

}

動態規劃初識

適合用動態規劃的問題特徵 可以分解成相互重疊的若干子問題 滿足最優性原理 結構性質 該問題的最優解中也包含著其子問題的最優解。一般地,子問題的聯絡體現在某種遞推關係,通過這種遞推計算可以把問題的解儲存起來,後期直接使用,避免重複運算。簡單的dp例子 遞推關係 m i j m i 1 j m i j ...

初識動態規劃

有乙個矩陣map,它每個格仔有乙個權值。從左上角的格仔開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。給定乙個矩陣map及它的行數n和列數m,請返回最小路徑和。保證行列數均小於等於100.輸入輸出樣例 第一行,輸入n,m表示這個矩陣...

初識動態規劃

let maxw 0 最大可放重量 let weight 2 2,4 6,3 物品重量 let n weight.length let w 11 揹包最大可承受重量 let men for let i 0 i n i men.push f 0,0 11 function f i,cw f i 1,c...