動態規劃
動態規劃,又名DP算法(取自其Dynamic Programming的縮寫),最初是運籌學的一個分支,是用來求解決策過程最優化的數學方法。
動態規劃算法通常用於求解具有某種最優性質的問題。
動態規劃應用場景:
適用動態規劃的問題必須滿足最優化原理、無後效性和重疊性。
1、最優化原理(最優子結構性質) 最優化原理可這樣闡述:一個最優化策略具有這樣的性質,不論過去狀態和決策如何,對前面的決策所形成的狀態而言,餘下的諸決策必須構成最優策略。簡而言之,一個最優化策略的子策略總是最優的。一個問題滿足最優化原理又稱其具有最優子結構性質。
2、無後效性 將各階段按照一定的次序排列好之後,對於某個給定的階段狀態,它以前各階段的狀態無法直接影響它未來的決策,而只能通過當前的這個狀態。換句話說,每個狀態都是過去歷史的一個完整總結。這就是無後向性,又稱爲無後效性。
3、子問題的重疊性 動態規劃將原來具有指數級時間複雜度的搜索算法改進成了具有多項式時間複雜度的算法。其中的關鍵在於解決冗餘,這是動態規劃算法的根本目的。動態規劃實質上是一種以空間換時間的技術,它在實現的過程中,不得不存儲產生過程中的各種狀態,所以空間複雜度要大於其它的算法。
揹包問題
給定 n 種物品和一個容量爲 C 的揹包,物品 i 的重量是 w,其價值爲 v 。
問:應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?
具體題目
可以使用一個表格去進行演示
解法歸納:
一、如果裝不下當前物品,那麼前n個物品的最佳組合和前n-1個物品的最佳組合是一樣的。
二、如果裝得下當前物品。
假設1 :裝當前物品,在給當前物品預留了相應空間的情況下,前n-1 個物品的最佳組合加上當前物品的價值就是總價值。
假設2:不裝當前物品,那麼前n個物品的最佳組合和前n-1個物品的最佳組合是一樣的。
選取假設1和假設2中較大的價值,爲當前最佳組合的價值。
揹包問題回溯
問題進階:在使得揹包內總價值最大的情況下,揹包內裝了哪些物品?
就相當於在表格當中從後往前逆推
歸納:
從表的右下角開始回溯,如果發現前n個物品最佳組合的價值和前n-1個物品最佳組合的價值一樣,說明第n個物品沒有被裝入。否則,第n個物品被裝入。
學習來源
https://www.bilibili.com/video/av62953142?from=search&seid=1091357594351821841
一起學習,一起進步 -.- ,如有錯誤,可以發評論