From c836257d6f5155b83137b48dece10899f478734d Mon Sep 17 00:00:00 2001 From: chenzhengwei Date: Thu, 16 Feb 2017 14:55:45 +0800 Subject: [PATCH] m416 --- Solution/401-450/416.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/Solution/401-450/416.md b/Solution/401-450/416.md index 1940fad..738e96a 100644 --- a/Solution/401-450/416.md +++ b/Solution/401-450/416.md @@ -43,4 +43,45 @@ public class Solution { return dp[len][target]; } } +``` +另外一个降低了空间复杂度的01背包方案 +```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[target + 1]; + Arrays.fill(dp, false); + dp[0] = true; + for (int i = 1; i < len + 1; i++) { + // 注意这里的方向是从后向前 + for (int j = target; j > 0; j--) { + if (j >= nums[i - 1]) { + dp[j] = dp[j] || dp[j - nums[i - 1]]; + } + } + } + return dp[target]; + } +} ``` \ No newline at end of file