演算法導論 動態規劃 鋼條切割問題的自底向上解法

2021-07-03 04:06:43 字數 823 閱讀 5235

正式應用動態規劃。

適用於動態規劃解決的問題應擁有以下兩個要素:

1. 最優子結構(最佳選擇)

2.子問題重疊(最終的最優解的每個分部步驟,都是當前最優的子解。與貪心演算法試圖通過區域性最優解來組合成最優解的思想相似)

主要用第一版**記錄思路。

共給出兩個功能函式。 max()和bottom_cut_rod(),作為主副功能函式。

max沒有什麼好說的

主函式bottom_cut_rod()

通過建立輔助陣列arr,來記錄當前n的最優解(最優子結構),從而使下次出現相同需求(即子問題重疊)時,可以從陣列中直接定位呼叫。省去了樸素解法中的冗餘和頻繁的遞迴呼叫,減少了時間和記憶體空間的消耗。

arr就是一種備忘機制。

雙重的for迴圈保證了每種情況的出現,通過不斷呼叫max函式迭代q來作為更新。 當每種選擇第一次完成後,通過輔助備忘陣列arr,來進行記錄,以供下次出現子問題重疊情時使用。

下面是cpp實現,除錯已通過。

#include using namespace std;

// 大小比較

int max(int a,int b)

//主要功能函式

int bottom_cut_rod(int *p,int n)

arr[j]=q;//記錄最優解

}return arr[n];//返回指定長度鋼條的最優解

}int main()

; int n;

cout<<"please input a int number"<>n;

int r=bottom_cut_rod(p,n);

cout<

動態規劃 鋼條切割《演算法導論》

給定各長度鋼鐵單位 以及乙個長度為n的鋼條,求最大效益 1 10 分別為p include includeint memorized cut rod aux int p,int len,int r 樸素遞迴演算法 演算法複雜度為2 n級這裡寫 int cut rod int p,int len in...

演算法導論 動態規劃 鋼條切割

這幾天一直在看動態規劃的問題,看了看也沒想象中那麼難,但需要好好的分析一下問題,我們就拿演算法導論的鋼條切割問題好好理解一下,鋼條切割問題就是給你一段鋼條,讓你把鋼條切割成好多份,因為每一段鋼條都有不同的價值,我們要找到最優的切割方案,使切割成的鋼條價值最大。這道題我們可以用dfs直接搜尋,對每個狀...

演算法導論 動態規劃之鋼條切割

動態規劃和分治策略相似,不同的是,它針對的問題所分解出的小問題數量很多且很多是重複的。動態規劃就是使得這些重複的小問題只需要計算一次,避免重複計算。鋼條切割問題 給定一段長度為n英吋的鋼條和乙個 表pi i 1,2,n 求切割鋼條方案,使得銷售收益rn最大。注意,如果長度為n英吋的鋼條的 pn足夠大...