python | 动态规划
# encoding: utf-8
#题目是:在arr中选出一堆数字,选出的数字不能是与它相邻的,然后使得选出的数字之和最大
import numpy as np
arr=[1,2,4,1,7,8,3]
#递归写法
def rec_opt(arr,i):
if i==0:
return arr[0]
elif i==1:
return max(arr[0],arr[1])
#为什么这里返回的是相邻两个之中的最大值?
#这不是违背条件了吗?
else:
A = rec_opt(arr,i-2)+arr[i]
B = rec_opt(arr,i-1)
return max(A,B)
#非递归写法
def dp_opt(arr):
opt = np.zeros(len(arr))
#创建一个数组大小等于arr,并且以零填充
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[len(arr)-1]
if __name__ == "__main__":
print(rec_opt(arr,6))
print(dp_opt(arr))
这里是对注释中的问题的解答,谢谢pyf师傅嗷~~
#encoding=utf-8
#题目要求:在一堆数找是否存在2个数使它们之和等于S
import numpy as np
arr=[3,34,4,12,5,2]
#递归写法
def rec_subset(arr,i,s):
if s==0:
return True
elif i==0:
return (arr[0] == s)
elif arr[i]>s:
return rec_subset(arr,i-1,s)
else:
A = rec_subset(arr,i - 1,s-arr[i])
B = rec_subset(arr, i - 1,s)
return A or B
#非递归写法(打表)
def dp_subset(arr,S):
subset = np.zeros((len(arr),S+1),dtype=bool) #生成一个二维数组,并且类型都是bool,初始化为0
subset[:,0] = True
subset[0,:] =False
subset[0,arr[0]] = True
for i in range(1,len(arr)):
for s in range(1,S+1):
if arr[i] > s:
subset[i,s] = subset[i-1,s]
else:
A = subset[i-1,s-arr[i]]
B = subset[i-1,s]
subset[i,s] = A or B
r,c = subset.shape
return subset[r-1,c-1]
if __name__ == '__main__' :
print(dp_subset(arr,9))
print(rec_subset(arr,len(arr)-1,13))