• 动态规划-01背包问题


    01 背包问题

    #coding=utf-8

    # 递归
    class Solution(object):
    def knapsack01(self, w, v,c):
    """
    :type w: list
    :type v: list

    """
    length = len(w)
    return self.bestValue(w,v,length-1,c)


    # 用[0...index]的物品,填充容积为c的背包的最大价值
    def bestValue(self,w,v,index,c):

    # 函数的定义说明了初值
    if index < 0 or c <= 0:
    return 0

    res = self.bestValue(w,v,index-1,c)

    if w[index] <= c:
    res = max(res,v[index] + self.bestValue(w,v,index-1,c-w[index]))

    return res

    # 记忆化递归
    class Solution2(object):
    def knapsack01(self, w, v, c):
    """
    :type w: list
    :type v: list

    """
    length = len(w)

    self.memo= [[-1 for i in range(c+1)] for i in range(length)]
    return self.bestValue(w, v, length - 1, c)

    # 用[0...index]的物品,填充容积为c的背包的最大价值
    def bestValue(self, w, v, index, c):

    if index < 0 or c <= 0:
    return 0


    if self.memo[index][c] != -1:
    return self.memo[index][c]


    res = self.bestValue(w, v, index - 1, c)

    if w[index] <= c:
    res = max(res, v[index] + self.bestValue(w, v, index - 1, c - w[index]))

    self.memo[index][c] = res
    return res





    # 动态规划
    class Solution3(object):
    def knapsack01(self, w, v, c):


    if not w :
    return 0

    length = len(w)

    memo = [[-1 for i in range(c+1) ] for i in range(length)]

    for i in range(c+1):

    if w[0] <= i:
    memo[0][i] = v[0]
    else:
    memo[0][i] = 0


    for i in range(1,length):
    for j in range(c+1):
    memo[i][j] = memo[i-1][j]

    if w[i] <= j:
    memo[i][j] = max(memo[i][j] ,v[i] + memo[i-1][j-v[i]])

    return memo[length-1][c]


    # 01背包问题的空间优化
    # 两行数组
    class Solution4(object):
    def knapsack01(self, w, v, c):

    if not w:
    return 0

    length = len(w)

    memo = [[-1 for i in range(c + 1)] for i in range(2)]

    for i in range(c + 1):

    if w[0] <= i:
    memo[0][i] = v[0]
    else:
    memo[0][i] = 0

    for i in range(1, length):
    for j in range(c + 1):
    memo[i%2][j] = memo[(i-1)%2][j]

    if v[i] <= j:
    memo[i%2][j] = max(memo[i%2][j], v[i] + memo[(i-1)%2][j - v[i]])

    return memo[(length-1)%2][c]



    # 01背包问题的空间优化
    # 一行数组
    class Solution5(object):
    def knapsack01(self, w, v, c):

    if not w:
    return 0

    length = len(w)

    memo = [-1 for i in range(c + 1)]

    for i in range(c + 1):

    if w[0] <= i:
    memo[i] = v[0]
    else:
    memo[i] = 0

    for i in range(1, length):
    for j in range(c,w[i]-1):
    memo[j] = max(memo[j], v[i] + memo[j - v[i]])

    return memo[c]
  • 相关阅读:
    objective-c数组
    objective-c可变数组
    objective-c可变字典
    objective-c字典
    有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
    将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
    一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?
    求123456789-23456789-3456789-456789-...-9的值
    编写一个程序,求s=1+(1+2)+(1+2+3)+…+(1+2+3+…+n)的值
    Unity3D笔记 GUI 二 、实现选项卡一窗口
  • 原文地址:https://www.cnblogs.com/lux-ace/p/10546191.html
Copyright © 2020-2023  润新知