鋼條切割 演算法導論

2021-10-10 13:20:06 字數 1336 閱讀 6980

給定長度任意長度的鋼條的價值,求解如何切割,使給定長度為n的鋼條的價值最大。

對於長度為n的鋼條,考慮子問題,我們遍歷1~n的第乙個切割的位置j,即得到長度為j和n-j的兩段鋼條,第一段不再切割,僅對第二段繼續切割,遞迴求解,於是就得到了乙個遞迴解法。這裡是c語言實現

#define _crt_secure_no_warnings

#include

#include

#define min -999999

#define maxsize 9999

int r[maxsize]

;//長度為n鋼條最大價值

intcut_pop_recursive

(int n,

int p)

return max;

}

但是可以看出時間複雜度極高為2^n。

不難發現,在求解過程中,重複求解了多次同樣的子問題,因此不妨考慮將子問題的解存起來。

於是得到第二個解法

#define _crt_secure_no_warnings

#include

#include

#define min -999999

#define maxsize 9999

int r[maxsize]

;//長度為n鋼條最大價值

void

memorized_cut_pop_init

(int n)

r[0]=

0;}int

memorized_cut_pop_recursive

(int n,

int p)

r[n]

= max;

}return r[n]

;}

這是一種自上而下的求解方法,時間複雜度為o(n^2)

下面是一種複雜度常係數更小的自下而上的解法

#define _crt_secure_no_warnings

#include

#include

#define min -999999

#define maxsize 9999

int r[maxsize]

;//長度為n鋼條最大價值

void

memorized_cut_pop_init

(int n,

int p)

r[0]=

0;}void

memorized_cut_pop

(int n,

int p)

}}

ps:後兩種解法呼叫前都需要初始化

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

給定各長度鋼鐵單位 以及乙個長度為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足夠大...