Number 416 分割等和子集

2021-10-06 05:43:41 字數 1279 閱讀 4717

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

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

陣列的大小不會超過 200

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

輸出: true

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

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

輸出: false

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

該問題課轉換為:從陣列中能否找到和為sum/2的子集

和0-1揹包為題類似,可以說一樣,因為我發現套用0-1揹包問題的模板居然也能通過:

class

solution

if(sum %2!=

0)return

false

; sum /=2;

int[

] dp =

newint

[sum +1]

;for

(int i =

0; i < len; i++)}

return

false;}

}

當然了,下面的題解才比較有意思:

dp[m]表示:容量為m時能否被裝滿

dp[m] = dp[m] || dp[j - nums[i]]:當nums[i]不選的時候,dp[m]狀態不變; 當nums[i]被選,由於dp的含義是恰好裝滿,所以dp[j - nums[i]]也為true。

class

solution

if(sum %2!=

0)return

false

; sum /=2;

boolean

dp =

newboolean

[sum +1]

; dp[0]

=true;if

(nums[0]

<= sum)

// 第乙個數只能讓容量為它自己的揹包裝滿

dp[nums[0]

]=true

;for

(int i =

1; i < len; i++)}

return dp[sum];}

}

416 分割等和子集

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

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 輸出...