问题描述
Seriling公司购买长钢条,将其切割为短钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。
假定我们知道Serling公司出售一段长为ii ii英寸的钢条的价格为pipi p_ipi(i=1,2,…,i=1,2,…, i=1, 2, … ,i=1,2,…,单位为美元)。钢条的长度均为整英寸。下表给出一个价格表样例。
思路:只考虑切一次,分为两段。自底向上求解并保存规模为j的钢条的最大价值在maxvalue数组,以规模为1的为基础求规模为2的(1+1或不切),每种切割方案总包含更小规模。用其本身价值与切割后的价值比较。
下面附上c++代码:
#include <bits/stdc++.h>
using namespace std;
void cut_rod(int *p,int n,int c)
{
int maxvalue[100],cutpoint[100],q;
memset(maxvalue,-1,sizeof(maxvalue));
memset(cutpoint,-1,sizeof(cutpoint));
maxvalue[0]=0;
int i,j,flag=0; //flag标记是否需要切割
for (j=1;j<=n;j++)
{
q=p[j]; //假设规模为j时的最大价值为不切割时的原始价值
flag=0;
for(i=1;i<=j;i++)
{
if(q<p[i]+maxvalue[j-i]-c) //在i处切割,两段总价值大于q则更新q
{
q=p[i]+maxvalue[j-i]-c;
cutpoint[j]=i; //记录切割点位置
flag=1; //需要切割
}
else if(flag==0)
{
cutpoint[j]=0;
}
maxvalue[j]=q;
}
}
while(cutpoint[n--]>=0) //输出
{
cout<<n+1;
cout<<':';
cout<<cutpoint[n+1];
cout<<' ';
cout<<maxvalue[n+1]<<endl;
}
}
int main()
{
int n,c;
cin>>n;
cin>>c;
int *p=new int[n+1];
int i;
for (i=1;i<=n;i++)
cin>>p[i];
cut_rod(p,n,c);
return 0;
}