您的位置:首页 > 其它

钢条切割问题

2014-05-22 09:11 295 查看
动态规划的一般步骤:

1.刻画一个最优解的结构特征

2.递归定义最优解的值

3.计算最优解的值,通常采用自底向上的方法

4.利用计算出的信息构造一个最优解

利用动态规划方法求解类似钢条切割方案的这一类递归问题,可避免反复求解相同的子结构,下面是朴素递归算法和用动态规划设计的递归算法的相应实现。

//钢条切割问题
#include "stdafx.h"

#define N 11

int p
={0,1,5,8,9,10,17,17,20,24,30};

//朴素递归 O(2^n)
int cut_rod(int n)
{
if(n==0)
return 0;
int max=-1;
for(int i=1;i<=n;++i)
{
int tmp=p[i]+cut_rod(n-i);
if(max<tmp)
{
max=tmp;
}
}
return max;
}

//动态规划,带备忘的自顶向下
//辅助过程
int memoized_cut_rod_AUX(int n,int* r);
int memoized_cut_rod(int n)
{
int *r=new int[n+1];
for(int i=0;i<=n;++i)
{
r[i]=-1;
}
int result=memoized_cut_rod_AUX(n,r);
delete [] r;
return result;
}

int memoized_cut_rod_AUX(int n,int* r)
{
if(r
>=0)
return r
;
if(0==n)
return 0;
int max=-1;
for(int i=1;i<=n;++i)
{
int tmp=p[i]+memoized_cut_rod_AUX(n-i,r);
if(max<tmp)
{
max=tmp;
}
}
return max;
}

//自底向上
int bottom_up_cut_rod(int n)
{
int* r=new int[n+1];
for(int i=0;i<=n;++i)
{
r[i]=0;
}
for(int j=1;j<=n;++j)
{
int max=-1;
for(int k=1;k<=j;++k)
{
int tmp=p[k]+r[j-k];
if(max<tmp)
max=tmp;
}
r[j]=max;
}
int result=r
;
delete [] r;
return result;

}

int main()
{
int putin;
while(1)
{

cin>>putin;
cout<<bottom_up_cut_rod(putin)<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: