Leetcode - Partition Equal Subset Sum

My code:

public class Solution {
    public boolean canPartition(int[] nums) {
        if (nums.length == 0) {
            return true;
        }
        
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        if (sum % 2 != 0) {
            return false;
        }
        sum = sum / 2;
        boolean[] dp = new boolean[sum + 1];
        dp[0] = true;
        
        for (int i = 1; i <= nums.length; i++) {
            for (int j = sum; j >= nums[i - 1]; j--) {
                dp[j] |= dp[j - nums[i - 1]];
            }
        }
        
        return dp[sum];
    }
}

reference:
https://discuss.leetcode.com/topic/62312/java-solution-similar-to-backpack-problem-easy-to-understand

首先,sum of total array should be even
其次,如果存在這么一種partition,那么,每個partition的和,一定是 sum / 2

然后,我們就可以用一種類似于 subset的方法,來求出,是否存在那么一組partition,他們的和是 sum / 2, 如果存在,一定還會有另外一組partition與之對應,和也是 sum / 2

所以用dp來解決這個問題。
然后我們的目的就是 sum / 2
所以他就是上限,任何 > sum / 2的序列,我們不感興趣
一開始我們放入 nums[0]
然后是
nums[0], nums[1], nums[0] + nums[1] (assume they are all <= sum / 2)
nums[0], nums[1], nums[0] + nums[1], nums[2], nums[0] + nums[2]
nums[1] + nums[2], nums[0] + nums[1] + nums[2]
....

最后,我們需要求得, dp[sum / 2] 是否為 true

Anyway, Good luck, Richardo! -- 10/13/2016

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容