416 分割等和子集

2021-10-24 16:21:50 字數 1299 閱讀 2033

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

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

陣列的大小不會超過 200

示例 1:

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

輸出: true

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

這道題可以轉化為,判斷從是否可以從陣列中選出一些數字,使得這些數字的和等於整個陣列的元素和的一半,也就是經典的01揹包問題,使用動態規劃求解。

定義二維陣列dp[n][target-1]。

dp[i][j]表示從前i個數字中是否能選出一些數字使他們的和等於j。

class

solution

:def

canpartition

(self, nums: list[

int])-

>

bool

: nums.sort(reverse =

true

) s =

sum(nums)

if s%2!=

0:return

false

target = s//

2if nums[0]

>target:

return

false

n =len(nums)

dp =[[

false

for _ in

range

(target+1)

]for _ in

range

(n)]

dp[0]

[nums[0]

]=true

for i in

range(1

,n):

for j in

range(1

,target+1)

:if nums[i]

>j:

dp[i]

[j]=dp[i-1]

[j]else

: dp[i]

[j]=

true

if dp[i-1]

[j]or dp[i-1]

[j-nums[i]

]else

false

return dp[-1

][-1

]

時間複雜度:o(n×target)

空間複雜度:o(n×target)

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