dynamic planning

1
2
3
4
5
6
7
8
9
10
11
12
13
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)

    
print(rec_opt(arr,6))

递归会产生很多的重叠的子问题,运算规模2^n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#非递归的方法
import numpy as np

def dp_opt(arr):
    opt = np.zeros(len(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]
dp_opt(arr)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

rec_subset(arr, len(arr)-1,9)
~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 非递归的方法,用二维数组来保存
def dp_subset(arr,s):
    subset = np.zeros((len(arr),s+1),dtype=bool)
    subset[:,0] = True
    subset[0,:] = Fasle
    subset[0,arr[0]] = True
    for i in range(1,len(arr)):
        for ss in range(1,s+1):
            if arr[i]> ss:
                subset[i,ss] = subset[i-1,ss]
            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]

rec_subset(arr, len(arr)-1,9)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值