力扣學習筆記 416 分割等和子集

2021-10-24 19:44:21 字數 1285 閱讀 3685

題目

寫題過程:一開始想的是先排序,再從中間位置尋找兩邊是否相等,可是想了想,不行,很容易推翻,最後去看力扣題解學習了一波

演算法主體

這題是經典的np 完全問題

如果只有乙個元素,直接返回fasle

我們可以把問題轉換為,尋找陣列內是否有資料可以組成所有資料總和的一半。這樣我們就可以轉換為(0 - 1揹包問題)

如果sum總和為奇數,直接返回false

如果陣列最大值max_t > sum / 2 的話,直接返回false

(①確定狀態)建立二位dp陣列(n, targrt + 1)(行數是陣列的大小,列數我們需要target這個值,所以要加1),dp[i][j]的值 代表陣列[ 0 , i ]之中是否有組合可以達到j的值

(②邊界處理)首先dp陣列全為false;dp[i][0] 全是true,乙個元素都不取,剛好符合 j == 0 ;而且dp[ 0 ] [ nums[0]] = true ;

(③轉移方程)如果 j > nums[i] 的話,dp[i][j] = dp[i - 1][j];反之,dp[i][j] = dp[i - 1][j] | dp[i -1][j - nums[i]];

時間複雜度:o(n * target);兩成迴圈佔大頭

10.空間複雜度:o(n * targrt))

源**

class

solution

int total =0;

int max_t = int_min;

for(

int t : nums)

if(total %2==

1)int target = total /2;

if(target < max_t)

vectorbool

>>

dp(n,vector<

bool

>

(target +1,

false))

;for

(int i =

0; i < n;

++i)

dp[0]

[nums[0]

]=true

;for

(int i =

1; i < n;

++i)

else}}

return dp[n -1]

[target];}

};

力扣 416 分割等和子集

最好用dp做,dfs會超時 package leetcode dp動態規劃 dp前先處理一下,對於下述兩種情況直接判false dp i j 表示下標在0.i之間的元素值之和是否等於j public class leetcode416 boolean res canpartition nums sy...

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