自上到下递归算法:
# 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);
}