问题描述
这题的最优解是使用Bottom up DP, 题目描述和详细解法可以参考这篇文章. 本文示范一下这题也可以直接使用这篇文章总结的0-1背包问题2维dp模版一字不改直接解
0-1背包问题2维度dp模版解法
问题稍微转换一下就可以等价成为0-1背包问题:
如果nums的和为奇数, 直接返回False, 因为不可能分成等和的两半加起来还是奇数.
有N个物品, 每个物品Cost为nums[i], Value为nums[i], 其中 i 属于 [0, …, N-1]
有一个书包, 容量为sum(nums) / 2
求书包能装下的最大Value 是否就是sum(nums) / 2
Python 2 代码实现如下
class Solution(object):
def maxKnapsackValue(self, N, C, W, V):
# init dp
row = [0] * (1 + V)
dp = []
for i in range(N + 1):
dp.append(list(row))
for i in range(1, N + 1):
for v in range(1, V + 1):
dp[i][v] = dp[i - 1][v]
if v - C[i - 1] >= 0:
dp[i][v] = max(
dp[i][v],
dp[i - 1][v - C[i - 1]] + W[i - 1]
)
return dp[N][V]
def canPartition(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
isum = sum(nums)
if isum % 2 != 0:
return False
target = isum / 2
print target
n = len(nums)
return self.maxKnapsackValue(
n, nums, nums, target) == target

该解法能过OJ, 虽然时间和空间用的都比较多.
