算法导论动态规划切钢管,两种方法的备忘录实现,可以打印超出价格表的最大收益和决策(python实现)

        钢管切割原始问题:


        某公司生产长钢管,然后一般,会将钢条切断,变成不同长度,然后去售卖。其中有个问题是,不同长度的钢管的售价是不一样的,但是它们并不是完全按照比例来,比如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)


猜你喜欢

转载自blog.csdn.net/qq_38445415/article/details/79746086
今日推荐