算法导论 第15章 动态规划:15.1钢条切割

来源:互联网 发布:网络名人周小平 编辑:程序博客网 时间:2024/04/29 05:16

自上到下递归算法:

# include <iostream>using namespace std;int cutrod(int a[],int n){    if(n==0)        return 0;    int q=-1;    for(int i=1;i<=n;i++)    {        if(a[i]+cutrod(a,n-i)>q)            q=a[i]+cutrod(a,n-i);    }    return q;}int main(){    int a[11]={0,1,5,8,9,10,17,17,20,24,30};    int n;    cin>>n;    cout<<cutrod(a,n);}

自下到上动态规划并输出切割方案:

# include <iostream>using namespace std;int main(){    int a[11]={0,1,5,8,9,10,17,17,20,24,30};    int b[11];//保存钢条切割最大价值    int c[11]={0,1,2,3,4,5,6,7,8,9,10};//保存切割方案,默认值为不切割    b[0]=0;    b[1]=1;    for(int i=2;i<=10;i++)    {        b[i]=a[i];        for(int j=1;j<i;j++)        {            if(b[j]+b[i-j]>b[i])            {                b[i]=b[j]+b[i-j];                c[i]=j;//更新切割方案            }        }    }    for(int i=0;i<=10;i++)    {         cout<<b[i]<<" ";         int j=i;         while(j>0)         {             cout<<c[j]<<" ";             j=j-c[j];         }         cout<<endl;    }}

带备忘的递归算法:

# include <iostream>using namespace std;int cutrod(int a[],int n,int b[]){    if(b[n]>=0)        return b[n];//此处检查备忘    int q;    if(n==0)        q=0;    else    {        q=-1;        for(int i=1;i<=n;i++)        {            if(a[i]+cutrod(a,n-i,b)>q)                q=a[i]+cutrod(a,n-i,b);        }    }    b[n]=q;//此处录入备忘    return q;}int main(){    int a[11]={0,1,5,8,9,10,17,17,20,24,30};    int b[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};    int n;    cin>>n;    cout<<cutrod(a,n,b);}
1 0