所謂動態規劃,從其名看,就是思想是動態的,但是演算法公式卻是固定的,只不過需要機器幫我們迴圈操作即可,(還有就是,動態規劃是乙個思想,並不是乙個公式哦,小夥伴們切記,會對我們理解有很大的幫助)所以我們首先做到就是找出這個公式即可。公式一般會涉及上層關係。
舉個栗子
01揹包 ,運用的就是動態規劃。簡要解釋一下01揹包,有n件物品,給你乙個容積為v的揹包,然後給你n個物品的**跟體積。讓你盡可能的拿去最多的東西。
有人會問,幹嘛又01揹包呢,假設一下,如果有個土豪給你乙個包,讓你去大街上隨便拿(雖然機率很小,不過說不定呢)。是不是要規劃一下。
言歸正傳,上**先。《這個是用一維陣列做的》
#include #include #define max 10000
using namespace std;
int dp[max],w[max],v[max];
int max(int i,int j)
int main()
for(i=1;i<=m;i++)
memset(dp,0,sizeof(dp));
for(i=1;i<=m;i++)
} // for(i=1;i<=t;i++){
// cout《關鍵** 就只是
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
這一句罷了。用二維的話比較好理解一下,dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]).上下層就是這個關係。乍一看是不是很複雜,只能用**下下你罷了。其實就是乙個思想現在的我等於 j-1 的我跟 [ j -w[i] ] (w是物品的大小,)的我誰大,誰大我等於誰。為什麼要減 w【i】 呢。因為我們要把前乙個物品拿出來啊。拿出來我們才能繼續放新的啊,你說對不對。既然拿出來 w[i].。那我們是不是要放進去?那就把 v【i】 放進去。然後比較一下誰大,大的有價值,那我肯定拿大的。對不對。
然後我們一直迴圈就好了。這就是動態的乙個基本的思想。一開始吧dp 設定為0,memset()就是把陣列設定為零。問問度娘怎麼用(一般就是那些格式。晚上無聊睡不著的時候就多看幾眼,然後就祝賀你有了乙個熟睡的夜晚)。
see you late
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...
自我剖析與規劃
在一番自我檢查中,許多問題都暴露出來 做題思考的速度,質量都大幅度下滑 的實現能力亟須提高 各種做題技巧 思考方法需要重新掌握 面對訓練的心態須要重新調整 這些問題歸納起來就是狀態不好,共同說明了保持訓練對於能力的重要性,以及停訓對於狀態的影響之大。較多的知識點未掌握,或僅僅停留在皮毛 如字串 資料...