您的位置:首页 > 其它

动态规划-钢条切割

2017-03-10 23:09 113 查看

一、问题描述

    一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi。那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大。如一个Pi如下:

长度i12345678910
价格Pi1589101717202430
    在距离钢条左端i长度处,我们总是可以选择切割或者不切割,所以长度为n的钢条共有2的n-1次方种不同的切割方案.

    对于上述价格表样例,我们可以观察所有最优收益值Ri及对应的最优解方案:

        R1 = 1,切割方案1 = 1(无切割)
    R2 = 5,  切割方案2 = 2(无切割)

    R3 = 8,  切割方案3 = 3(无切割)

    R4 = 10, 切割方案4 = 2 + 2

    R5 = 13, 切割方案5 = 2 + 3

    R6 = 17, 切割方案6 = 6(无切割)

    R7 = 18, 切割方案7 = 1 + 6或7 = 2 + 2 + 3

    R8 = 22, 切割方案8 = 2 + 6

    R9 = 25, 切割方案9 = 3 + 6

    R10 = 30,切割方案10 = 10(无切割)

    更一般地,对于Rn(n >= 1),我们可以用更短的钢条的最优切割收益来描述它:

   Rn = max(Pn, R1 + Rn-1, R2 + Rn-2,...,Rn-1 + R1)

    首先将钢条切割为长度为i和n - i两段,接着求解这两段的最优切割收益Ri和Rn - i,(每种方案的最优收益为两段的最优收益之和),由于无法预知哪种方案会获得最优收益,我们必须考察所有可能的i,选取其中收益最大者


源码实现


int Steel(int* length, int* price, int N)
{
int i, j;
memset(dp, 0, sizeof(dp));

for(i = 1; i <= N; i++)
{
int p = price[i];
for(j = 0; j <= i; j++)
{
p = max(p, dp[j] + dp[i-j]);
}
dp[i] = p;
}
return dp
;
}



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