python实现动态规划的实例

摘自B站up主   正月点灯笼

https://space.bilibili.com/24014925/#/video

# [1,2,4,1,7,8,3]
# 选出一堆不相邻的数字,使他们的和最大
# 选出的数字不能是相邻的

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, i):
    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]

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

def dp_subset(arr, s):
    subset = np.zeros((len(arr), s+1), dtype=bool)
    # 所有行的第0 个 都是 True
    subset[:, 0] = True

    # 第 0 行 全是 False , 除了第 arr[0]
    subset[0, :] = False
    subset[0, arr[0]] = True
    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:
                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]

# print(rec_subset(arr, len(arr) - 1, 9))


# print(dp_opt(arr, 6))

print(dp_subset(arr, 9))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值