python 动态规划 供应链_DP动态规划Python实现,python

本文介绍了如何使用Python解决两个动态规划问题:1. 找到数组中不相邻元素的最大和;2. 判断数组内是否存在子集的和等于目标值。通过递归和动态规划两种方法分别给出解决方案,并通过示例进行验证。
摘要由CSDN通过智能技术生成

注:全文参考

正月点灯笼

b站up主!!

1、求数组内不相邻数的最大和。

839ab13befba39dfb847a49d0711ca31.png

arr = [1,2,4,1,7,8,3]

def ret_opt(arr, i):

if i == 0:

return arr[0]

elif i == 1:

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

else:

A = ret_opt(arr, i-2) + arr[i]

B = ret_opt(arr, i-1)

return max(A,B)

def dp_opt(arr):

opt = [1] * len(arr)

if len(arr) == 0:

return arr[0]

elif len(arr) == 1:

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

else:

opt[0] = arr[0]

opt[1] = max(arr[0], arr[1])

for i in range(2,len(arr)):

A = opt[i-2] + arr[i]

B = opt[i-1]

opt[i] = max(A,B)

return opt[-1]

ret = ret_opt(arr, len(arr)-1)

dp = dp_opt(arr)

print(ret, dp)

2、求数组内子集是否能加和等于S。

c90a1e27413d51ff231cc31af38ff406.png

arr = [3,34,4,12,5,2]

s = 13

def ret_subset(arr, i, s):

if s == 0:

return True

elif i == 0:

return arr[0] == s

elif arr[i] > s:

return ret_subset(arr, i-1, s)

else:

A = ret_subset(arr, i-1, s-arr[i])

B = ret_subset(arr, i-1, s)

return A or B

def dp_subset(arr, s):

subset = [[False] * (s+1) for _ in range(len(arr))]

if arr[0] < s+1:

subset[0][arr[0]] = True

for i in range(len(arr)):

subset[i][0] = True

for i in range(1,len(arr)):

for j in range(1,s+1):

if arr[i] > j:

subset[i][j] = subset[i-1][j]

else:

A = subset[i-1][j-arr[i]]

B = subset[i-1][j]

subset[i][j] = A or B

return subset[-1][-1]

ret = ret_subset(arr, len(arr)-1, s)

dp = dp_subset(arr, s)

print(ret, dp)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值