您的位置:首页 > 编程语言 > C语言/C++

c++使用动态规划dp(自底向上)重构解决钢条切割输出最大收益和切割方案及运行实例结果

2017-12-28 15:17 441 查看
其他钢条切割算法见上一篇博文

扩展动态规划算法,使每个子问题不仅保存最优收益值,还保存对应的切割方案,这样可以输出最优解

伪代码







c++代码实现

#include <iostream>

using namespace std;

int extendedBottomUpCutRod(int p[],int n,int r[],int s[])
{
//int r[n+1];记录不同规模子问题的解,这里是1~10
//int s[n+1];记录切割的解,即怎样切的
int q;//记录收益
r[0]=0;
for(int j=1;j<=n;++j)
{
q=-1;//初始为负,常见的表示未知数的方法
for(int i=1;i<=j;++i)
{
if(q<p[i-1]+r[j-i])
{
q=p[i-1]+r[j-i];
s[j]=i;
}
}
r[j]=q;
}
}

void printCutRodSolution(int p[],int n,int r[],int s[])
{
extendedBottomUpCutRod(p,n,r,s);
cout<<"长度为"<<n<<"的钢条按照此种切割方法的最优收益为:"<<r
<<endl;
cout<<"对应的最优切割方案的解为:";
while(n>0)
{
cout<<s
<<" ";//输出最优切割方案
n=n-s
;
}
}

int main()
{
int p[9]={1,5,8,9,10,17,17,20,24};
int r[10],s[10];
printCutRodSolution(p,9,r,s);
return 0;
}


运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐