給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。
注意:每個陣列中的元素不會超過 100
陣列的大小不會超過 200
示例 1:
輸入: [1, 5, 11, 5]
輸出: true
解釋: 陣列可以分割成 [1, 5, 5] 和 [11].
這道題可以轉化為,判斷從是否可以從陣列中選出一些數字,使得這些數字的和等於整個陣列的元素和的一半,也就是經典的01揹包問題,使用動態規劃求解。定義二維陣列dp[n][target-1]。
dp[i][j]表示從前i個數字中是否能選出一些數字使他們的和等於j。
時間複雜度:o(n×target)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)
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 輸出...