給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。
注意:每個陣列中的元素不會超過 100
陣列的大小不會超過 200
示例 1:
輸入: [1, 5, 11, 5]
輸出: true
解釋: 陣列可以分割成 [1, 5, 5] 和 [11].
示例 2:
輸入: [1, 2, 3, 5]
輸出: false
解釋: 陣列不能分割成兩個元素和相等的子集.
答案
class
solution
for(
int num:nums)
if(sum%2!=
0)int target=sum/2;
if(maxnum>target)
//創造乙個[len][target+1]的二維陣列,其中len表示陣列元素個數,target表示目標值。
//陣列從0開始,所以i-1為當前要分的個數,可通過nums[i]找到陣列元素值,j表示當前要達到的目標值,在這i-1個元素的情況下,可以加出j則為true
//需要得到len個元素是否能獲得target所以為[len][target+1],最後[len-1][target]即為答案。
//該二維陣列是可以加出j即為true,而不是要等分為兩份為j的陣列。
boolean
dp =
newboolean
[len]
[target+1]
;//boolean型資料預設為false。
//當j為0時,為true,可以理解為可以把元素分為空集和其他所有集,空集那部分則可以加為0。
for(
int i=
0;i)//當i=0,可用元素只有乙個,則只有j=此元素才能加出j。
dp[0]
[nums[0]
]=true
;//從i=1開始,依次增加元素
for(
int i=
1;i)//當最新元素小於j時,如果dp[i-1][j]為true,即之前的元素就能加出j,那麼此時dp[i][j]為true。
//如果dp[i-1][j]為false也有可能這個元素可以組成j,此情況可以轉為某個數x+nums[i]=j,則x=j-nums[i]
//那麼可以轉化為前幾個元素能否組成x,dp[i][j]=dp[i-1][x]=dp[i-1][j-nums[i]]
//上述兩種情況有乙個為true,則為true。
else}}
return dp[len-1]
[target];}
}
分割等和子集
給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。示例 1 輸入 1 5,11 5 輸出 true 解釋 陣列可以分割成 1,5,5 和 11 示例 2 輸入 1 2,3 5 輸出 false 解釋 陣列不能分割成兩個元素和相等的子集.思路 1.首先求陣列總...
分割等和子集 力扣
題意理解 給定乙個陣列,求將其分成兩組,是否存在兩組內部元素的和相等。問題分析 動規問題轉化為 給定一組元素,求是否存在這組元素中任意數量的元素加起來和等於這組元素的和的一半?其他鏈結 bool canpartition vector nums sum sum 2 int count nums.si...
力扣分割等和子集
給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意 每個陣列中的元素不會超過 100 陣列的大小不會超過 200 示例 1 輸入 1,5,11,5 輸出 true 解釋 陣列可以分割成 1,5,5 和 11 示例 2 輸入 1,2,3,5 輸出 fals...