最优值:是总收益最大。
- 递推公式:
- 分为切与不切:
//钢条切割
#include<bits/stdc++.h>
using namespace std;
#define M 101
int c[M], p[M];//c[n]长度为n最大收益,p[n]钢条长度为n的价格
int rec[M]; //记录长度为n最优方案
main()
{
int n, q;
cout<<"please input steel rod length:";
cin>>n; c[0]=0; //初始化
cout<<"\nplease input steel rod's length of n 长度1~~"<<n<<"从小到大对应的价格:\n";
for(int j=1;j<=n;j++)
cin>>p[j];
for(int j=1;j<=n;j++)
{
rec[j] = j; //不切
for(int i=1;i<=j-1;i++) //枚举切割长度
{
if(p[j]<p[i]+c[j-i])
{
p[j] = p[i]+c[j-i]; rec[j]=i;//更新
}
}
c[j] = p[j]; //保存子问题的解
}
cout<<"钢条最大收益:"<<c[n]<<"\n"<<"切割长度分别为:\n";
while(n>0)
{
cout<< rec[n]<<",";
n = n-rec[n]; //剩余钢条长度
}
return 0;
}