代码随想录day42|背包问题416. 分割等和子集

背包问题二维数组

def test_2_wei_bag_problem1():
    weight = [1, 3, 4]
    value = [15, 20, 30]
    bagweight = 4

    # 二维数组
    dp = [[0] * (bagweight + 1) for _ in range(len(weight))]

    # 初始化
    for j in range(weight[0], bagweight + 1):
        dp[0][j] = value[0]

    # weight数组的大小就是物品个数
    for i in range(1, len(weight)):  # 遍历物品
        for j in range(bagweight + 1):  # 遍历背包容量
            if j < weight[i]:
                dp[i][j] = dp[i - 1][j]
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])

    print(dp[len(weight) - 1][bagweight])

test_2_wei_bag_problem1()

背包问题一维数组

def test_1_wei_bag_problem():
    weight = [1, 3, 4]
    value = [15, 20, 30]
    bagWeight = 4

    # 初始化
    dp = [0] * (bagWeight + 1)
    for i in range(len(weight)):  # 遍历物品
        for j in range(bagWeight, weight[i] - 1, -1):  # 遍历背包容量
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

    print(dp[bagWeight])


test_1_wei_bag_problem()

416. 分割等和子集

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        target = sum(nums) /2
        if target != int(target):
            return False
        target =int(target)
        dp = [0] * (target+1)
        print(target)
        for i in nums:
            for j in range(target,-1,-1):
                if j >= i:
                    dp[j] = max(dp[j],dp[j-i]+i)
        if dp[target] == target:
            return True
        else:
            return False

你可能感兴趣的:(算法)