C 入門DP 動態規劃

2021-10-04 05:23:07 字數 1310 閱讀 2662

本篇為入門級,dalao繞道(捂臉)

dp最經典題目-01揹包問題

思路簡單清晰,將物品和價值都遍歷,進行選擇

for

(int i=

1;i<=n;i++

)//從第乙個物品到最後乙個物品遍歷

} cout << dp[n]

[m]<< endl ;

優化**,時間複雜度不變,降低了空間複雜度

for

(int i=

1;i<=n;i++

)for

(int j=m;j>=w[i]

;j--

) dp[j]

=max

(dp[j]

,dp[j-w[i]

]+v[i]);

cout << dp[m]

<< endl ;

dp01揹包公升級版–完全揹包

和01揹包的區別在於我們同乙個物品可以選擇多次,次數不限。

在01中有以下code

dp[i]

[j]=

max(dp[i-1]

[j],dp[i-1]

[j-w[i]

]+v[i]

);

我們的理解是,dp[i][j]要麼是不選擇i,直接為dp[i-1][j];要麼是選擇i,即dp[i-1][j-w[i]]+v[i],後者的理解是在i之前i的價值加上總重減去i的重量後的價值的最大值,我們現在可以多次選擇i物品,所以就不用變成i之前了(i-1),就i即可

for

(int i=

1;i<=n;i++)}

cout << dp[n]

[m]<< endl ;

同樣,我們可以減小它的空間複雜度

for

(int i=

1;i<=n;i++

)for

(int j=w[i]

;j<=m;j++

) dp[j]

=max

(dp[j]

,dp[j-w[i]

]+v[i]);

cout << dp[m]

<< endl ;

動態規劃入門(dp)

dp的基本思想,是把大問題轉化成乙個個小問題,然後遞迴解決。所以本質思想的話還是遞迴。dp最重要的是要找到狀態轉移方程,也就是把大問題化解的過程。舉個例子 乙個數字金字塔 112 2332 2243 133 在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得路徑上所經過的數字之和最大。路徑上的每一...

C 動態規劃DP

動態規劃 將子問題的解記錄下來,記憶花搜尋 狀態 dp i j 狀態轉移方程 從邊界開始 底開始 往上走,第 i j 的狀態就是最大的加上它自己。dp i j max dp i 1 j dp i 1 j 1 f i j 邊界就是他自己 for int j 1 j n j 從倒數第二層開始 for i...

動態規劃入門 DP基礎

1,include using namespace std int main int solve int i,int j int main float p,pj,q,qj int n,mj float dp 5000 int main dp 0 1 for int i 1 i n i for int...