題目鏈接
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
。