动态规划算法 - 钢条切割问题

  1 #include"stdafx.h"
  2 #include<iostream>
  3 using namespace std;
  4 /*
  5 动态规划算法:
  6 1.刻画一个最优解的结构特征
  7 2.递归地定义最优解的值
  8 3.计算最优解的值,通常采用自底向上的方法
  9 4.利用计算出的信息构造一个最优解.
 10 */
 11 /*普通递归法*/
 12 int CutRod(int *p ,int n)
 13 {
 14     if(n==0)
 15         return 0;
 16     int q=0;
 17     for(int i = 1;i<=n;++i)
 18     {
 19         q=max(q,p[i]+CutRod(p,n-i));
 20     }
 21     return q;
 22 }
 23 
 24 /*加入了备忘录机制*/
 25 int CutRodMemoized(int *p ,int *r,int n);
 26 int memory(int *p ,int n)
 27 {
 28     int *r = new int[n];
 29     for(int i =0 ;i!=n;i++)
 30     {
 31         r[i]=-1;
 32     }
 33     return CutRodMemoized(p,r,n);
 34 }
 35 int CutRodMemoized(int *p ,int *r,int n)
 36 {   
 37     if(r[n]>=0)
 38         return r[n];
 39     int q = -1;
 40     if(n==0)
 41         q = 0;
 42     else{
 43         q=-1;
 44         for(int i = 1;i<=n;++i)
 45             q=max(q,p[i]+CutRodMemoized(p,r,n-i));
 46     }
 47     r[n]=q;
 48     return q;
 49 }
 50 
 51 /*自底向上版本*/
 52 int BottomUp(int *p,int n)
 53 {
 54     int *r = new int[n];
 55     r[0]=0;
 56     for(int j = 1;j<=n;j++)
 57     {
 58         int q = -1;
 59         for(int i = 1;i<=j;i++){
 60          q = max(q,p[i] +r[j-i]);
 61         }
 62         r[j]=q;
 63     }
 64     return r[n];
 65 }
 66 
 67 /*自底向上版本扩展,记录切割点,也就是实现第四步,构造出最优解*/
 68 int BottomUpExtent(int *p,int n,int *r,int *s);
 69 void BottomExtent(int *p,int n)
 70 {
 71     int *r = new int[n];
 72     int *s = new int[n];
 73     cout<<"最大收益"<<BottomUpExtent(p,n,r,s)<<endl;
 74     cout<<"切割方式为:"<<endl;
 75     while(n>0){
 76         cout<<s[n]<<"  ";
 77         n = n-s[n];
 78     }
 79 }
 80 int BottomUpExtent(int *p,int n,int *r,int *s)
 81 {
 82     
 83     r[0]=0;
 84     s[0]=0;
 85     for(int j = 1;j<=n;j++)
 86     {
 87         int q = -1;
 88         for(int i = 1;i<=j;i++){
 89             if(q<p[i]+r[j-i])
 90             {
 91                  q = p[i] +r[j-i];
 92                  s[j] = i;
 93             }
 94         
 95          
 96         }
 97         r[j]=q;
 98     }
 99     return r[n];
100 }
101 
102 int _tmain(int argc, _TCHAR* argv[])
103 {
104     int q[11]={0,1,5,8,9,10,17,17,20,24,30};
105     cout<<CutRod(q,8)<<endl;
106     cout<<memory(q,8)<<endl;
107     cout<<BottomUp(q,8)<<endl;
108     BottomExtent(q,8);
109 }

 

posted @ 2014-04-05 17:08  CrazyCode.  阅读(341)  评论(0编辑  收藏  举报