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

2021-07-04 03:06:39 字數 1415 閱讀 7146

///給定各長度鋼鐵單位**,以及乙個長度為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)

int q=0;

for(int i=1;i<=len;i++)

q=q>p[i]+cut_rod(p,len-i)?q:p[i]+cut_rod(p,len-i);

return q;

}//動態規劃解決問題所依據的更小問題已得到解決//

//動態規劃演算法-自頂而下//

int memorized_cut_rod(int *p,int

len)

int memorized_cut_rod_aux(int *p,int

len,int *r)

for (int i=1;i<=len;i++)

q=q>p[i]+memorized_cut_rod_aux(p,len-i,r)?q:p[i]+memorized_cut_rod_aux(p,len-i,r);//尋找最大的收益

r[len]=q;//記錄相應的最大收益

return r[len];

}自底而上的寫法更簡單,而且效率更好

///無論哪種方法時間複雜度都是n^2級

int bottom_up_cut_rod(int *p,int

len)

r[j]=q;//記錄j長度收益最大值

} return r[len];

}/擴充套件版動態規劃返回解決方案//

/s[0]為最大收益,s[n]為切割方案

int extend_bottom_up_cut_rod(int *p,int

len,int *s)

for (int j=1;j<=len;j++)

int main()

; const

intlen

=7; int *s=new

int[len

+1];

printf("%d\n",cut_rod(p,len));

printf("%d\n",memorized_cut_rod(p,len));

printf("%d\n",bottom_up_cut_rod(p,len));

extend_bottom_up_cut_rod(p,len,s);

printf("%d\n",s[0]);

int n=len;

while (n>0)

getchar();

return

0;}

演算法導論

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

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

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

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

鋼條切割 演算法導論

給定長度任意長度的鋼條的價值,求解如何切割,使給定長度為n的鋼條的價值最大。對於長度為n的鋼條,考慮子問題,我們遍歷1 n的第乙個切割的位置j,即得到長度為j和n j的兩段鋼條,第一段不再切割,僅對第二段繼續切割,遞迴求解,於是就得到了乙個遞迴解法。這裡是c語言實現 define crt secur...