小鱼要学数据结构与算法(基于python)—Day10动态规划案例分析+递归小结

解决问题的策略

在这里插入图片描述

一、知识概览

本章介绍了动态案例分析——博物馆大盗问题。分别用动态规划和递归法求解。最后对递归进行小结。
知识概览

二、博物馆大盗问题

2.1 动态规划解法

# #博物馆大盗问题
# ##动态规划解法
# #宝物的重量和价值
tr=[None,{'w':2,'v':3},{'w':3,'v':4},
#          {'w':4,'v':8},{'w':5,'v':8},
#          {'w':9,'v':10}]
# #大盗最大承重
max_w=20
# #初始化二维表格m[(i,w)]
# #表示前i个宝物中,最大重量w的组合,所得到的最大价值
# #当i什么都不取,或w上限为0,价值均为0
m={(i,w):0 for i in range(len(tr))#len(tr)是6
             for w in range(max_w+1)}
# #逐个填写二维表格
for i in range(1,len(tr)):
    for w in range(1,max_w+1):
        if tr[i]['w']>w:#装不下第i个宝物
            m[(i,w)]=m[(i-1,w)]#不装第i个宝物
        else:
            m[(i, w)] =max(
                m[(i - 1, w)],
                m[(i-1,w-tr[i]['w'])]+tr[i]['v'])
# #输出结果
print(m[(len(tr)-1,max_w)])

输出

29

2.2 递归解法

#递归解法
#宝物的重量和价值,元组的集和
tr={(2,3),(3,4),(4,8),(5,8),(9,10)}
max_w=20
#初始化记忆化表格m
#key是(宝物组合,最大重量),value是最大价值
m={}
def thief(tr,w):
    if tr==set() or w==0:
        m[tuple(tr),w]=0#tuple是key的要求
        return 0#基本结束条件
    elif (tuple(tr),w) in m:
        return m[tuple(tr),w]
    else:
        vmax=0
        for t in tr:
            if t[0]<=w:
                #逐个从集合中去掉某个宝物,递归调用
                #选出所有价值中最大值
                v=thief(tr-{t},w-t[0])+t[1]
                vmax=max(vmax,v)
        m[tuple(tr),w]=vmax
        return vmax
print(thief(tr,max_w))

输出

29
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章