钢管切割原始问题:
某公司生产长钢管,然后一般,会将钢条切断,变成不同长度,然后去售卖。其中有个问题是,不同长度的钢管的售价是不一样的,但是它们并不是完全按照比例来,比如2米的钢管售价要比3米的钢管售价要少,但是并不是2比3的比例。钢管的长度售价表如下:
长度i | 1 2 3 4 5 6 7 8 9 10 |
价格Pi | 1 5 8 9 10 17 17 20 24 30 |
自底而上
p = [0,1,5,8,9,10, 17, 17, 20, 24, 30]
def cut_rod(n):
r= [0 for k in range(100)]
cut = [0 for k in range(100)]
for j in range(1, n + 1):
q = -1
for i in range(1, j + 1):
if (q < p[i] + r[j - i]):
q = p[i] + r[j - i]
cut[j]=i
r[i] = q
if n > 10:
p.append(q)
s=[[]]*100
t=n
for i in range(1,n+1):
while(t>0):
s[i].append(cut[t])
t=t-cut[t]
print("长度为",n,"的钢管切割后长度", s[n],"最大收益",r[n])
cut_rod(25)
cut_rod(36)
cut_rod(55)
自顶而下
p = [0,1,5,8,9,10, 17, 17, 20, 24, 30]
s=[[]]*100
def cut_aid(p,n,r,s):
if r[n]>=0:#r为最大收益列表
return r[n]
q=-1
if n==0:
q=0
else:
for i in range(1,n+1):
if q<p[i]+cut_aid(p,n-i,r,s):
q=p[i]+cut_aid(p,n-i,r,s)
s[i].append(i)
if n>=10:
p.append(q)
r[n]=q
# for i in range(1,n+1):
# s[i][:-1]=[]#取最后一次的结果作为第一段
return q
def cut_rod(p,n):
r= [-1 for k in range(100)]
print("长度为%d的钢管最大收益%d"%(n,cut_aid(p,n,r,s)))
print("长度%d的钢管切割方案"%(n))
#print(r[1:n+1])
m=s[0]
a=[]
for i in range(0,len(m)):
if (i==len(m)-1):
a.append(m[i])
elif(m[i]>=m[i+1]):
a.append(m[i])
a.insert(0,0)
t=n
b=[]
while(t>0):
b.append(a[t])
t=t-a[t]
print(b)
cut_rod(p,35)
cut_rod(p,24)
cut_rod(p,67)