【前言】前段時間對動態規劃有了初步的理解,但那時候沒有自己實現**,所以對動態規劃的理解還只停留在理論上吧,具體是怎麼實現出來的其實不是特別清楚。多虧了軟考必須要明白**的邏輯,然後就實現了動態規劃的**,這樣動態規劃的理解就加深了一點兒。
一、基本思想:
將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題中解得到原問題的解。
二、性質:
1.最優子結構:如果乙個問題的最優解彙總包含了其子問題的最優解,就說該問題具有最優子結構。但是乙個問題具有最優子結構時,動態規劃可能會適用,但此時貪心演算法也可能是使用的。
2.重疊子問題:指用來解決原問題的遞迴演算法可反覆地解同樣的子問題,而不是總在產生新的子問題。即當乙個遞迴演算法不斷地呼叫同乙個問題時,據說該問題包含重疊子問題。
三、01揹包問題
01揹包問題和揹包問題時有區別的,01揹包問題表示將要放到揹包中的物品是不可分割的就只有兩種狀態一種是放進去另一種就是沒放進去;但是揹包問題還存在放進去一部分的情況。
0,i=0或w=0
c[i,w]= c[i-1,w], wi>w
max, i>0且wi <=w
**實現:
static void main(string args)
; int weights = new int[5] ;
int[,] c = new int[6,18];//6和18是為了防止下標越界
//可放入的物品為0時,無論揹包的剩餘容量為多大,價值都為0
for (w = 0; w <= w; w++)
for (i = 1; i <= n; i++)
else
} else//放不到揹包裡
} }
//輸出最大價值
console.writeline("揹包最大價值:" + c[n, w]);
console.read();
//求最優解
int x = new int[6];
for (i = n; i > 1; i--)
else
} if (c[1, w] == 0)
else
foreach (var item in x)
console.writeline("放入揹包的物品有:");
for (i = 1; i <= n; i++)
} console.readkey();
} }
【總結】先了解思想和原理去根據公式寫展開式,明白了這一過程我們再去用**來實現,來證明我們理解的是不是正確的,加油! 演算法 動態規劃0 1揹包問題
有乙個容量為 n 的揹包,要用這個揹包裝下物品的價值最大,這些物品有兩個屬性 體積 w 和價值 v。定義乙個二維陣列 dp 儲存最大價值,其中 dp i j 表示前 i 件物品體積不超過 j 的情況下能達到的最大價值。設第 i 件物品體積為 w,價值為 v,根據第 i 件物品是否新增到揹包中,可以分...
演算法之動態規劃 0 1揹包
經典的盜賊問題 乙個盜賊帶著乙個揹包去偷東西,房中有五件物品 1 6公斤 48元 2 5公斤 40元 3 2公斤 12元 4 1公斤 8元 5 1公斤 7元 但是他的揹包只能裝下8攻擊的東西 問他該怎樣選擇保障拿到的東西價值最大。思路 使用動態規劃來實現,1.將物品i 放到揹包裡面,修改選擇標誌 2...
動態規劃之01揹包問題
首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?可以這樣理解 揹包的揹負有上限,因此在這個上限內盡可能多的裝東西,並且價值越多越好。在這裡我之想討論動態規劃解決這個問題的詳細過程。動態規劃是用空間換時間的一種方法的抽象。其...