From a0a413fce57218cfd485f87325f3e2f99bc8770f Mon Sep 17 00:00:00 2001 From: chenzhengwei Date: Thu, 16 Feb 2017 14:37:27 +0800 Subject: [PATCH] a416 --- README.md | 2 ++ Solution/401-450/416.md | 46 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 Solution/401-450/416.md diff --git a/README.md b/README.md index 5a8a439..68daa19 100644 --- a/README.md +++ b/README.md @@ -116,3 +116,5 @@ leetcode 题解 [383. Ransom Note](Solution/351-400/383.md) +[416. Partition Equal Subset Sum](Solution/401-450/416.md) + diff --git a/Solution/401-450/416.md b/Solution/401-450/416.md new file mode 100644 index 0000000..1940fad --- /dev/null +++ b/Solution/401-450/416.md @@ -0,0 +1,46 @@ +#416. Partition Equal Subset Sum +[题目链接](https://leetcode.com/problems/partition-equal-subset-sum/) +```java +public class Solution { + /* + 转化为01背包问题 + */ + public boolean canPartition(int[] nums) { + // 首先判断一些特殊情况 + int sum = 0; + for (int i = 0; i < nums.length; i++) { + sum += nums[i]; + } + if (sum % 2 == 1) { + return false; + } + int target = sum / 2; + for (int i = 0; i < nums.length; i++) { + if (nums[i] > target) { + return false; + } else if (nums[i] == target) { + return true; + } + } + + // 如果仍无法判断,转化为01背包问题 + int len = nums.length; + boolean[][] dp = new boolean[len + 1][target + 1]; + for (int i = 0; i < dp.length; i++) { + Arrays.fill(dp[i], false); + } + for (int i = 0; i < len + 1; i++) { + dp[i][0] = true; + } + for (int i = 1; i < len + 1; i++) { + for (int j = 1; j < target + 1; j++) { + dp[i][j] = dp[i - 1][j]; + if (j >= nums[i - 1]) { + dp[i][j] = dp[i][j] || dp[i - 1][j - nums[i - 1]]; + } + } + } + return dp[len][target]; + } +} +``` \ No newline at end of file