动态规划经典题目python_正月点灯笼_动态规划例题_Python实现

声明:

0.感谢@正月点灯笼大神的DP教学视频  对于新手来说十分友好

1.代码为视频笔记 均由本人自行完成 稳定性与准确性未验证

2.转载附作者Id 及作品链接

1-1card16544031_web.png

1-1card18512769_web.png

代码如下:

一、报酬问题

schedule=(

[1 ,4 ,5 ],

[3 ,5 ,1 ],

[0 ,6 ,8 ],

[4 ,7 ,4 ],

[3 ,8 ,6 ],

[5 ,9 ,3 ],

[6 ,10,2 ],

[8 ,11,4 ],

)

lists=[]

for i in range(8):

front=None

for j in range(8):

if not schedule[j][1]>schedule[i][0]:

front=j

lists.append([i,front])

def optimum(item):

if item==None:

return 0

else:

try:

result=lists[item][2]

except:

result=None

if result:

return result

else:

pre_item=item-1

front_item=lists[item][1]

if pre_item<0:

return schedule[item][2]

else:

case_1=optimum(pre_item)

case_2=optimum(front_item)+schedule[item][2]

lists[item].append(max(case_1,case_2))

return max(case_1,case_2)

def maximum(time):

event=None

for i in range(8):

if schedule[i][1]<=time:

event=i

if event==None:

return 0

else:

return optimum(event)

time=200

pay=maximum(time)

print(lists)

print(pay)

二、强盗问题

def optimum(arr,num):

try:

result=arr[num][1]

except:

result=None

if result:

return result

else:

if num<1:

return arr[num][0]

elif num<2:

return max(arr[num][0],arr[num-1][0])

else:

case_1=optimum(arr,num-1)

case_2=optimum(arr,num-2)+arr[num][0]

arr[num].append(max(case_1,case_2))

return max(case_1,case_2)

if __name__ == "__main__":

array=[[1],[2],[4],[1],[-7],[8],[3],[9],[6],[2],[0],[7],[-5]]

maximum=optimum(array,len(array)-1)

print(maximum)

三、组成数问题

def tell_1(ran,_sum):

if _sum==0:

return True

if _sum<0:

return False

if ran==0:

return _sum==array[0]

case_1=tell_1(ran-1,_sum-array[ran])

case_2=tell_1(ran-1,_sum)

return case_1 or case_2

def tell_2(_range,summary):

memory=[[None for _ in range(summary+1)] for _ in range(_range+1)]

#二维数组

for i in range(_range+1):

for j in range(summary+1):

if i==0:

memory[i][j]=False

if j==0:

memory[i][j]=True

#初始化

memory[0][array[0]]=True

def search(mem,ran,_sum):

if _sum<0:

return False

else:

result=mem[ran][_sum]

if result==None:

case_1=search(mem,ran-1,_sum)

case_2=search(mem,ran-1,_sum-array[ran])

result=case_1 or case_2

mem[ran][_sum]=result

return result

return search(memory,_range,summary)

if __name__ == "__main__":

array=[400,12,54,29,6,141,9,0,10,21,24,102]

summary=400

#要求值

_range=len(array)-1

#查找范围

if_exist=tell_1(_range,summary)

print(if_exist)

if_exist=tell_2(_range,summary)

print(if_exist)

此栏目预测共享自学之乐,共勉求知之友,共塑网站和谐好学的形象。

欢迎大家在评论区发表合理的意见和指正。

如果觉得该栏目对您有帮助,望不吝点赞收藏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值