这里有一堆物资待分配,物资总数量不超过200
(
0
<
m
≤
200
)
(0<m≤200)
(0<m≤200),每件物资重量不超过100
(
0
<
m
≤
100
)
(0<m≤100)
(0<m≤100)。
请问是否可以将这堆物资分配给两个队伍,使得两个队伍的全部的物资重量和相等。
示例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
购物车问题
题解:购物车