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