动态规划 算法导论 钢铁切割 部分Python代码

#带备忘
def Memoized_cut_rod(p,n):
    r=[]
    for i in range(n+1):
        r.append(-999)
    return Memoized_cut_rod_aux(p, n,r)
def Memoized_cut_rod_aux(p,n,r):
    if r[n]>=0:
        return r[n]
    if n==0:
        q=0
    else:
        q=-1
        for i in range(1,n+1):
            q=max(q,p[i]+Memoized_cut_rod_aux(p,n-i,r))
    r[n]=q
    return q
p=[0,1,5,8,9,10,17,17,20,24,30]

def cut_Rod(p,n):
    # 普通递归实现
    if n==0:
        return 0
    q=0
    for i in range (1,n+1):
        q=max(q,price[i]+cut_Rod(price,n-i))
    return q
price=[0,1,5,8,9,10,17,17,20,24,30] # 切一根 价格为1 2 为5
print(cut_Rod(price,9),"递归实现")
print(Memoized_cut_rod(p,9),"带备忘,自顶向下")

### 自低向下
def bottom_up_cut_rod(p,n):
    r=[-99 for i in range(n+1)]
    r[0]=0
    for j in range(1,n+1):
        q=0
        for i in range(1,j+1):
            q=max(q,p[i]+r[j-i])
        r[j]=q
    return r[n]
p=[0,1,5,8,9,10,17,17,20,24,30]
print(bottom_up_cut_rod(p,4))

def extend_bottom_up_cut_rod(p,n):
    r=[-1 for i in range(n+1)]
    s=[-1 for i in range(n+1)]
    r[0]=0
    for j in range(1,n+1):
        q=0
        for i in range(1,j+1):
            if q < p[i]+r[j-i]:
                q=p[i]+r[j-i]
                s[j]=i
        r[j]=q



    return r, s
p=[0,1,5,8,9,10,17,17,20,24,30]
print(extend_bottom_up_cut_rod(p,4),"优化 的自底向上")
def Print_cut_rod_solution (p,n):
    (r,s)=extend_bottom_up_cut_rod(p,n)
    print("\n价格",r,"\n 长度",s,"输出各切割方案\n")
    while n>0:
        n=n-s[n]
    print(r)
Print_cut_rod_solution(p,10)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值