数组中是否存在几个数的相加结果为9(递归vs动态规划)

递归思路:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值