问题:求切割不同长度钢条所能获得的最大收益。属于动态规划问题,需要寻求最小子结构的最优解。
递推式一:
代码:
def qiege_1(p,n):
if n==0:
return 0
else:
res=p[n]
for i in range(1,n):
res=max(res,qiege_1(p,i)+qiege_1(p,n-i))##递推式
return res
递推式二:
代码:
def qiege_2(p,n):
if n==0:
return 0
else:
res=0
for i in range(1,n+1):
res=max(res,p[i]+qiege_2(p,n-i))#递推式二
return res
方法3:
使用两层循环而不是递归,与方法二相似。
##用循环而不用递归
def qiege_3(p,n):
r=[0]
for i in range(1,n+1):
res=0
for j in range(1,i+1):
res=max(res,p[j]+r[i-j])
r.append(res)
return r[n]
总代码:
#动态规划问题
##两个递归
def qiege_1(p,n):
if n==0:
return 0
else:
res=p[n]
for i in range(1,n):
res=max(res,qiege_1(p,i)+qiege_1(p,n-i))
return res
##简化方法 一个递归
def qiege_2(p,n):
if n==0:
return 0
else:
res=0
for i in range(1,n+1):
res=max(res,p[i]+qiege_2(p,n-i))
return res
##用循环而不用递归
def qiege_3(p,n):
r=[0]
for i in range(1,n+1):
res=0
for j in range(1,i+1):
res=max(res,p[j]+r[i-j])
r.append(res)
return r[n]
p=[0,1,5,8,9,10,17,17,20,24,30]
print(qiege_1(p,9))
print(qiege_2(p,9))
print(qiege_3(p,9))
结果: