题目链接
416.分割等和子集
class Solution {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;// dp[i]表示:背包容量为i时,能装的最大子集和 int[] dp = new int[target + 1];for (int i = 0; i < nums.length; i++) { for (int j = target; j >= 0; j--) {if (j - nums[i] >= 0) {// 更新dp[j]:比较不放入当前数字和放入当前数字两种情况 dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);}}}return dp[target] == target;}
}
小结:01背包问题,先遍历物品,再遍历背包,逆序遍历背包,确保每个数组只用一次。如[1,2,3]
,target=4
,正序遍历会误认为4
个1
可以凑出4
。