动态规划-钢条切割

    xiaoxiao2021-03-25  45

    一、问题描述

        一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为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[N]; }

    
    转载请注明原文地址: https://ju.6miu.com/read-26055.html

    最新回复(0)