首先可以看出这是个连续求最优问题,可以用动态规划求解,这里的解法选用Python居多。对于非线性的应用问题,往往只能采用“走一步看一步”的方法解决,即动态规划。解决思路是每一步都选择其中的最优解,即贪心算法。与分治法类似,通过组合子问题的解来求解全问题。
主要思路:
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.
最后可以总结出,该类动态规划问题均可以通过这种方式解决。