| 
 | 
	
    
 
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
《算法导论(第三版)》第十五章,动态规划 7 E: D8 x1 B, ~! O- U/ v 
    由于我学习《算法导论(第三版)》这本书,更多的是应用于解制造业的工程问题,不是用于IT行业,所以针对数据结构这一块儿,不作为我的重点部分,我只做基本了解,不做深入学习,所以选择性跳过,若今后有遇到相关工程问题,再补该方面知识。 
8 X6 d" ?- @1 [! r6 c  u- k+ | 
( ^0 c4 X; u8 M$ W针对本书关于钢条切割方面的讨论,涉及起始取地址从0开始,由于MATLAB本身语法限制,在相同思想下,将代码进行了适当修改。 
% x! p1 J7 J  L2 o; F+ \3 P4 j: u, H7 v- t' X) {4 |7 k4 ~ 
朴素递归算法解钢铁切割问题: 
" B5 {! b  [+ J; `1 A- clear;clc
 - p=[1 5 8 9 10 17 17 20 24 30];
 - CUT_ROD(p,4)%朴素递归算法 自顶向下
 - [r s]=EXTENDED_BOTTOM_UP_CUT_ROD(p,10)%动态规划算法 自底向上9 a! w! X" U. g1 ]1 b: O8 d2 B
 
  " Z& W0 ?- ]3 X0 `" v# ? 
 
/ h. |) E  e* M, u2 g 
: s- g+ u) x7 t* o: Z朴素递归算法:. H" W. J0 r9 a+ A 
- function [q] = CUT_ROD(p,n)
 - %自顶向下递归实现钢铁切割问题 《算法导论》第十五章 动态规划
 - %算法思想:将钢铁分为左右两段,左段不切,为收益最大值,右段一直切,直到切完。
 - if n==0%右段已切完
 -     q=0;
 -     return;
 - end
 - q=-inf;%收益从负开始
 - for i=1:n
 -     q=max([q,p(i)+CUT_ROD(p,n-i)]);%寻求是否切的最大收益
 - end
 - end) m+ c. I& u* F
 
 
  
0 z- `' f) M  H4 i5 d 
" T- Z) w# z. l. k% Q- a* g9 ~, L; f" J0 g  [8 i0 ` 
动态规划算法:% `4 d$ k* b1 B) D3 L 
- function [r,s] = EXTENDED_BOTTOM_UP_CUT_ROD(p,n)
 - %动态规划:自底向上
 - r=p;%初始化不切割为最大收益
 - s=1:n;%初始化不切割为最大收益的切割方式
 - for j=2:n
 -     for i=1:j-1%去掉i==j的情况,不需要跟本身作比较
 -         if r(j)<p(i)+r(j-i)
 -             r(j)=p(i)+r(j-i);
 -             s(j)=i;
 -         end
 -     end
 - end
 - end! M7 @! N" d3 f( C3 @/ H
 
  8 j* y$ v& p% _5 H  }8 k) X; d5 O, F 
" C- s$ }' ^" J- g 
 
2 k% \0 T* G7 Q0 C$ |在解决取地址从0开始的问题时,突然想到,假设将初始切割方案直接默认为为不切割方案,将比书中的效果更佳。6 K9 L" f) a3 k& N! K 
 |   
 
 
 
 |