pydata

Keep Looking, Don't Settle

leetcode 416. Partition Equal Subset Sum

416. Partition Equal Subset Sum

题目大意 给定一个数组,求能不能把数组分成两部分使得两个子数组的和相等

解题思路:直接brute force解,数组的每个元素都取二进制0或者1来表示有没有选取,这样时间复杂度太高。会超时

动态规划:dp[i][j]表示能否用数组前i个元素的到和j。退一步就是能否用前i-1个元素得到和 j - num_i 。所以如果 dp[i-1][j - num_i] 成立,那么dp[i][j]也成立。最后就是检查dp[n-1][sum/2]是不是成立。所以如果数组的和为基数的话,那么肯定无解。

动态规划

class Solution(object):
    def canPartition(self, nums):
        n = len(nums)
        s = sum(nums)
        if s % 2 != 0:
            return False
        dp = [0 for _ in range(s + 1)]
        dp[0] = 1
        for num in nums:
            for i in range(s, -1, -1):
                if dp[i]:
                    dp[i+num] = 1
            if dp[s/2]:
                return True
        return False