动态规划 钢条切割问题 两种方法 自底而上 自上而下的方法

来源:互联网 发布:在淘宝开店怎么取消 编辑:程序博客网 时间:2024/05/22 04:51
/*函数:动态规划  解决钢条切割问题两种方法 自底而上  自上而下的方法  一般自底而上的方法没有递归调用的开销,效率好些长度      1   2   3   4   5   6   7   8   9   10价格      1   5   8   9   10  17  17  20  24  30寻找方法将长度问n的钢管切割,使得价格最高.动态规划的方法保存子问题的结果,不必每次都求仔细安排求解顺序.时间:15.7.23Jason Zhou  热爱你所写下的程序,他是你的伙伴,而不是工具.*/#include<iostream>using namespace std;int find_max(int a,int b){    return (a<b) ? b:a;}int memoized_cut_rpd_aux(int p[],int n,int r[]){    int q=-1;    if (n!=0 && r[n-1]>0)    {        return r[n-1];    }    if (0==n)    {        q=0;        return q;    }    else    {        for (int i=1;i<=n;i++)        {            q=find_max(q,p[i-1]+memoized_cut_rpd_aux(p,n-i,r));        }    }    r[n-1]=q;    return q;}//自顶向下的法  保存子问题的解.int memoized_cut_rod(int p[],int n){    int len=sizeof(p)/sizeof(p[0]);    int * r=new int[n];    for (int i=0;i<n;i++)    {        r[i]=-1;    }    memoized_cut_rpd_aux(p,n,r);    cout<<"----------"<<endl;    for (int i=0;i<n;i++)    {        cout<<"  "<<r[i];    }    cout<<endl;    int q=r[n-1];    delete [] r;    return q;}// 自底向上的方法int bottom_cut_rod(int p[],int n){    int *r=new int[n+1];    r[0]=0;    for (int j=1;j<=n;j++)    {        int q=-1;        for (int i=1;i<=j;i++)        {            q=find_max(q,p[i-1]+r[j-i]);//注意要保证 r[0]=0        }        cout<<"---:q="<<q<<"  j="<<j<<endl;        r[j]=q;    }    int tmp=r[n];    delete [] r;    return tmp;}int main(){    int p[]={1,5,8,9,10,17,17,20,24,30};    int len=sizeof(p)/sizeof(p[0]);    //方法1  自上而下的方法    int q=memoized_cut_rod(p,10);    cout<<"结果"<<q<<endl;    //方法2  自下而上的方法    int m=bottom_cut_rod(p,10);    cout<<"结果"<<m<<endl;    return 0;}
0 0