Sep.24 0-1背包问题

两只队伍分物资

这里有一堆物资待分配,物资总数量不超过200 ( 0 < m ≤ 200 ) (0<m≤200) (0<m200),每件物资重量不超过100 ( 0 < m ≤ 100 ) (0<m≤100) (0<m100)
请问是否可以将这堆物资分配给两个队伍,使得两个队伍的全部的物资重量和相等。

示例1

  • 输入
    [1, 5, 11, 5]
  • 输出
    true

—说明
数组可以分为 [1, 5, 5] 和 [11]

示例2

  • 输入
    [1, 2, 3, 5]
  • 输出
    false

思路

首先考虑能不能对半分,不能直接返回,如果能,那么我们就类似的把背包的空间看成sum/2,每一个物品的重量既是重量也是需要的空间,我们最后只需要看能不能恰好装满sum/2即可。

# python3
class Solution:
    def canPartition(self , nums ):
        if not nums:
            return True
        if sum(nums) % 2 == 1:
            return False
        s = sum(nums) // 2
        dp = [0] * sum(nums)
        for i in range(len(nums)):
            j = s
            while j >= nums[i]:
                dp[j] = max(dp[j], dp[j-nums[i]] + nums[i])
                j -= 1
        return dp[s] == s

购物车问题
题解:购物车

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值