0
点赞
收藏
分享

微信扫一扫

3.6_cut_rod_钢条切割问题

艾晓雪 2022-02-14 阅读 49
def cut_rod_recursion_1(p, n):
    """最慢的递归 2 次: 大量重复计算"""

    if n == 0:
        return 0
    else:
        res = p[n]
        for i in range(1, n):
            res = max(res, cut_rod_recursion_1(p, i) + cut_rod_recursion_1(p, n - i))

        return res
def cut_rod_recursion_2(p, n):
    """递归一次: top-down"""

    if n == 0:
        return 0
    else:
        res = 0
        for i in range(1, n + 1):
            res = max(res, p[i] + cut_rod_recursion_2(p, n - i))

        return res

 

def cut_rod_dp(p, n):
    """动态规划: bottom-up"""

    dp = [0]

    # i:dp 对应的 index
    # j:长度对应的 index
    for i in range(1, n + 1):
        res = 0
        for j in range(1, i + 1):
            res = max(res, p[j] + dp[i - j])
        dp.append(res)

    return dp[n]

 

def cut_rod_extend(p, n):

    dp = [0]
    s = [0]

    for i in range(1, n + 1):
        # 记录价格最大值、对应方案中 左边不切割的长度
        res_r = 0
        res_s = 0

        for j in range(1, i + 1):
            if p[j] + dp[i - j] > res_r:
                res_r = p[j] + dp[i - j]
                res_s = j
        dp.append(res_r)
        s.append(res_s)

    return dp[n], s


def cut_rod_solution(p, n):

    r, s = cut_rod_extend(p, n)
    res = []

    while n > 0:
        res.append(s[n])
        n -= s[n]

    return f'最大利润: {r} 元,方案: {res}'

 

举报

相关推荐

钢条切割问题

0 条评论