最优钢铁切割
前言
一家公司购买长钢条,将其切割成短钢条出售,假设切割本身没有成本,长度为i的短钢条的价格为Pi。那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大。例如
长度 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
价格 | 1 | 5 | 8 | 9 | 10 | 17 | 17 | 20 | 14 | 30 |
一、蛮力法
代码如下
int m1(int n){
if(n==0)
return 0;
int q=-1;
// 截断为两半递归计算子问题
for(int i=1;i<=n;i++){
q=max(q,p[i]+m1(n-i));
}
return q;
}
二、动态规划
代码如下(示例):
int r[11];//采用r数组保存长度为n的组合最大值
int m(int n){
if(r[n]>0){
return r[n]; //大于0表示已经计算过且是最优解
}
int q=0;
if(n==0)q==0;
else{
for(int i=1;i<=n;i++){
q=max(q,p[i]+m(n-i));
}
}
r[n]=q;//保存最大值
return q;
}
三、重构不使用递归改为迭代后
代码如下
int m3(int n){
for(int i=1;i<=n;i++){
int q=-1;
for(int j=1;j<=i;j++){
q=max(q,r[i-j]+p[j]);
}
r[i]=q;
}
return r[n];
}