- 核心:记住已经求过的解。
- 方法:自顶向下备忘录法,自底向上
钢条切割问题
自顶向下备忘录法
def cut(chain,chainlen,memo):
q=-1
if memo[chainlen]>=0:
return memo[chainlen]
if chainlen==0:
q=0
else:
for i in range(1,chainlen+1):
q=max(q,cut(chain,chainlen-i,memo)+chain[i-1])
memo[chainlen]=q
return q
def dynamic(chain,chainlen):
memo=[]
for i in range(chainlen+1):
memo.append(-1)#初始化将备忘录全部置为-1
return cut(chain,chainlen,memo)
chain=[1,5,8,9,10,17,17,20,24,30]#链条的价格表
chainlen=3#链条的长度
dynamic(chain,chainlen
自底向上
#自底向上
def bottom_up_cut(chain,chainlen):
memo=[]
for i in range(0,chainlen+1):
q=0
for j in range(1,i+1):
q=max(q,memo[i-j]+chain[j-1])
memo.append(q)
return memo[chainlen]
chain=[1,5,8,9,10,17,17,20,24,30]#链条的价格表
chainlen=1#链条的长度
bottom_up_cut(chain,chainlen)