切割钢条问题(rod cutting problem)

问题描述

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值