给一个长度为n的钢条,可将其切割成整数长度的几段(共2的n-1次方种切法,对于每个位置可选择切割或不切割); 长度i的钢条具有Pi的价格,如何切割(也可能不切割)能使得受益最大?
设长度j的钢条最大收益r[j]
,第一刀切割长度s[j]
;
对于子问题:切割长度j(j<=n)的钢条,假设第一刀切在i,i<=j,
则此时的收益:
r[j] = max(Pi + r[j-i]), for i = 1 to j
因此为求得r[j],我们需要所有长度小于j的钢条的r
def cut_rod (p, n):
r = [0] * (n + 1)
for j in xrange(1, n + 1):
q = -float('inf')
for i in xrange(1, j + 1):
q = max(q, p[i] + r[j - i])
r[j] = q
return r[n]