递归思路:
arr = [3,34,4,12,5,2] # i=len(arr)-1, s=target number def sub_rec(arr, i, s): # ending condition 1: target number becomes to zero(requirement has been satisfied). if s == 0: return True # ending condition 2: target number equals to last number(requirement has been satisfied). OR not equal means not satisfied. elif i == 0: return arr[i] == s # recursion condition 1: if number > target number, we will skip this number and continue check the next number. elif arr[i] > s: return sub_rec(arr, i-1, s) # recursion condition 2: if number <= target number, we consider both two situation(take this number or not). else: yes = sub_rec(arr, i-1, s-arr[i]) no = sub_rec(arr, i-1, s) return yes or no print(sub_rec(arr, len(arr)-1, 9))
动态规划思路:
import numpy as np
arr = [3,34,4,12,5,2]
def subset_dp(arr, S):
# create a matrix for saving the status for each combination of arr[i] and s.
# defualt value is False
subset = np.zeros((len(arr),S+1),dtype=bool)
# for all arr[i], set True if s==0
subset[:,0] = 1
# set arr[0]=False for all s
# and set True only when arr[0]==s
subset[0,:] = 0
subset[0,arr[0]] = 1
# same as recursion conditions
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:
yes = subset[i-1, s-arr[i]]
no = subset[i-1,s]
subset[i,s] = yes or no
r,c = subset.shape
print(subset)
# [arr[5],9] is the result
return subset[r-1,c-1]
subset_dp(arr,9)
"""
arr[i] s = 0 1 2 3 4 5 6 7 8 9
3 arr[0] [[False False False True False False False False False False]
34 arr[1] [ True False False True False False False False False False]
4 arr[2] [ True False False True True False False True False False]
12 arr[3] [ True False False True True False False True False False]
5 arr[4] [ True False False True True True False True True True]
2 arr[5] [ True False True True True True True True True True]]
"""
"""
https://www.youtube.com/watch?v=Jakbj4vaIbE
from time stamp 00:16:00
"""