416 分割等和子集

2021-09-26 01:43:46 字數 1145 閱讀 1866

給定乙個只包含正整數非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。

注意:

每個陣列中的元素不會超過 100

陣列的大小不會超過 200

示例 1:

輸入: [1, 5, 11, 5]

輸出: true

解釋: 陣列可以分割成 [1, 5, 5] 和 [11].

示例 2:

輸入: [1, 2, 3, 5]

輸出: false

解釋: 陣列不能分割成兩個元素和相等的子集.

思路:看到這個題目,首先想到把所有的數求和,只有原陣列所有數字和是偶數的時候,才有可能分割子集合。那麼問題就轉換為能不能找到乙個非空子集合,使得其數字之和為 target。零一揹包問題,動態規劃解決。dp[i][j]表示j能否由前i個數的部分和組成,可以的話,dp[i][j]為true,否則為false

1、如果沒選nums[i]:dp[i][j] = dp[i-1][j]

2、如果選了nums[i]:dp[i][j] = dp[i-1][j-nums[i]],dp[i-1][j-nums[i]]表示j-nums[i]能否由前i-1個數組成。

因此,狀態轉移方程為dp[i][j]= dp[i-1][j] || dp[i-1][j-nums[i]]

class solution 

for(int i=1; i<=nums.size(); ++i)}}

return dp[nums.size()][sum];

}};

對**進行空間優化:從後往前遍歷,每次預設的dp[j]就相當於上面的dp[i-1][j], 每次預設的dp[j-x]就相當於上面的dp[i-1][j-x]。

一定要從後往前遍歷,算後面的數要用到前面的值,如果從前往後遍歷的話,dp[j-x]會被更新,不是上面的dp[i-1][j-x]!!!

class solution 

}return dp[sum];

}};

416 分割等和子集

主要題目中說了不超過100個數字,數字都不超過200。所以可能的和不會超過20000,這個量級對計算機來說不算大,所以考慮用dp考察每個可能的和是否存在。class solution int sum accumulate nums.begin nums.end 0 if sum 1 int siz ...

416 分割等和子集

題目描述 給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意 每個陣列中的元素不會超過 100 陣列的大小不會超過 200 示例 1 輸入 1,5,11,5 輸出 true 解釋 陣列可以分割成 1,5,5 和 11 示例 2 輸入 1,2,3,5 輸出...

416 分割等和子集

給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意 每個陣列中的元素不會超過 100 陣列的大小不會超過 200 判斷所給陣列是否滿足條件,若陣列中任意數字和為總和二分之一 總和必須為偶數 則為true class solution def canpar...