解决一个钢条切割的算法问题

182 阅读2分钟

首先可以看出这是个连续求最优问题,可以用动态规划求解,这里的解法选用Python居多。对于非线性的应用问题,往往只能采用“走一步看一步”的方法解决,即动态规划。解决思路是每一步都选择其中的最优解,即贪心算法。与分治法类似,通过组合子问题的解来求解全问题实验十一01.JPG

实验十一02.JPG

实验十一03.JPG

主要思路:

Get 最大值函数

对于n>10情况,拆分成2个子问题再比较最大值

将比较q值赋为-9999

要想知道n长度钢条怎么切割最大,需要知道n-1钢条怎么切割最大,再去比较是1+(n-1)两段收益高还是不切割n直接卖收益高,

def max(a, b):
    temp = a;
    if temp < b:
        temp = b;
    return temp
def meri(p, n, r):
    n = n - 1
    if r[n] >= 0:
        return r[n]
    if n <= 10:
        if n == 0:
            q = 0
        else:
            q = -9999
            for i in range(1, n):
                q = max(q, int(p[i]) + int(meri(p, n - i, r)))
    else:
        q = -9999
        for i in range(0, n):
            q = max(q, int(r[i + 1]) + int(meri(p, n - i, r)))
    r[n] = q
    print("n=", n)
    print("r=", r)
    return q
def mero(p, n):
    r = {}
    for i in range(0, n):
        r[i] = -9999
    r[1] = p[0]
    return meri(p, n, r)
p = [1, 5, 8, 9, 10, 17, 17, 20, 24, 30]
print("输入钢条长度n:")
n = int(input())
if n == 1:
    print("最大的收益:", p[0])
print("最大的收益:", mero(p, n + 1))

其实,依次比较max(n(如果n<10可以不切),1+(n-1),2+(n-2),3+(n-3)…),然后后续要知道n-1最大收益,需要知道n-2怎么切割收益高,要知道···最后递归到n=1的时候的收益。,从实验结果中可以看出当给出的钢条数量为12时,所得到的最优收益为35.

最后可以总结出,该类动态规划问题均可以通过这种方式解决。