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))

  

#encoding=utf-8
#在一堆数找是否存在2个数使它们之和等于S
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_shbset(arr,i-1,s)
	else:
		A = rec_subset(arr,i-1,s-arr[i])
	# 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))

	B = rec_subset(arr,i-1,s)
		return A or B
if __name__="__main__"	
print(rec_subset(arr,len(arr)-1,9)

  

猜你喜欢

转载自www.cnblogs.com/chrysanthemum/p/11802264.html