動態規劃是用空間換時間的一種方法的抽象。其關鍵是發現子問題和記錄其結果。然後利用這些結果減輕運算量。
比如01揹包問題。
/* 乙個旅行者有乙個最多能用m公斤的揹包,現在有n件物品,
它們的重量分別是w1,w2,...,wn,
它們的價值分別為p1,p2,...,pn.
若每種物品只有一件求旅行者能獲得最大總價值。
輸入格式:
m,nw1,p1
w2,p2
......
輸出格式:
x */
因為揹包最大容量m未知。所以,我們的程式要從1到m乙個乙個的試。比如,開始任選n件物品的乙個。看對應m的揹包,能不能放進去,如果能放進去,並且還有多的空間,則,多出來的空間裡能放n-1物品中的最大價值。怎麼能保證總選擇是最大價值呢?看下表。
測試資料:
10,3
3,44,5
5,6c[i][j]陣列儲存了1,2,3號物品依次選擇後的最大價值.
這個最大價值是怎麼得來的呢?從揹包容量為0開始,1號物品先試,0,1,2,的容量都不能放.所以置0,揹包容量為3則裡面放4.這樣,這一排揹包容量為4,5,6,....10的時候,最佳方案都是放4.假如1號物品放入揹包.則再看2號物品.當揹包容量為3的時候,最佳方案還是上一排的最價方案c為4.而揹包容量為5的時候,則最佳方案為自己的重量5.揹包容量為7的時候,很顯然是5加上乙個值了。加誰??很顯然是7-4=3的時候.上一排 c3的最佳方案是4.所以。總的最佳方案是5+4為9.這樣.一排一排推下去。最右下放的資料就是最大的價值了。(注意第3排的揹包容量為7的時候,最佳方案不是本身的6.而是上一排的9.說明這時候3號物品沒有被選.選的是1,2號物品.所以得9.)
從以上最大價值的構造過程中可以看出。
f(n,m)=max這就是書本上寫的動態規劃方程.這回清楚了嗎?
下面是實際程式:
#include
int c[10][100];/*對應每種情況的最大價值*/
int knapsack(int m,int n)
else c[i][j]=c[i-1][j];
}return(c[n][m]);
}int main()
system("pause");
}
動態規劃之0 1揹包詳解
動態規劃是用空間換時間的一種方法的抽象。其關鍵是發現子問題和記錄其結果。然後利用這些結果減輕運算量。比如01揹包問題。乙個旅行者有乙個最多能用m公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,wn,它們的價值分別為p1,p2,pn.若每種物品只有一件求旅行者能獲得最大總價值。輸入格式 m,n...
動態規劃之01揹包
動態規劃的基本思想 將乙個問題分解為子問題遞迴求解,且將中間結果儲存以避免重複計算。通常用來求最優解,且最優解的區域性也是最優的。求解過程產生多個決策序列,下一步總是依賴上一步的結果,自底向上的求解。動態規劃演算法可分解成從先到後的4個步驟 1.描述乙個最優解的結構,尋找子問題,對問題進行劃分。2....
動態規劃之01揹包
01揹包問題,是用來介紹動態規劃演算法最經典的例子,網上關於01揹包問題的講解也很多,我寫這篇文章力爭做到用最簡單的方式,最少的公式把01揹包問題講解透徹。f i,j 表示在前i件物品中選擇若干件放在承重為 j 的揹包中,可以取得的最大價值。pi表示第i件物品的價值。決策 為了揹包中物品總價值最大化...