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

/*
函数:动态规划  解决钢条切割问题


两种方法 自底而上  自上而下的方法  
一般自底而上的方法没有递归调用的开销,效率好些

长度      1   2   3   4   5   6   7   8   9   10
价格      1   5   8   9   10  17  17  20  24  30

寻找方法将长度问n的钢管切割,使得价格最高.

动态规划的方法
保存子问题的结果,不必每次都求
仔细安排求解顺序.


时间:15.7.23
Jason 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值