/*
函数:动态规划 解决钢条切割问题
两种方法 自底而上 自上而下的方法
一般自底而上的方法没有递归调用的开销,效率好些
长度 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;
}
动态规划 钢条切割问题 两种方法 自底而上 自上而下的方法
最新推荐文章于 2024-08-23 03:46:44 发布