Leetcode 416分割等和子集

2022-08-13 01:06:16 字數 668 閱讀 8708

已知是個揹包問題,由於可以等分為兩部分,所以必定是個偶數。

一開始想到的是回溯法

bool helper(vector&nums, int i, int sum,int t)

}bool canpartition(vector& nums)

但是這個方法存在重複計算,時間複雜度不過關,如何避免重複計算呢?每位加與不加一共有2種可能,怎麼利用記憶化?必須記憶的有,和是多少;然後還需要記憶已經用了哪些數字,不能重複加自己。首先得熟悉揹包問題的思想。但是揹包問題是求最大值,想不到怎麼轉換過去。直接看答案。。。(逃

其實從遞迴方程應該可見端倪,遞迴考慮的是加和不加數字,然後遞迴的變數是布林型變數,所以對於第\(i\)個數字,狀態轉移方程就很明顯了

建立的狀態是dp[i][j]i及之前的數字,能否組成j,故dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i]]

bool canpartition(vector& nums) 

if(dp[i][target]==true)

return true;

}return dp[len-1][target];

}

leetcode 416 分割等和子集

方法一 用動態規劃 class solution return res half 方法二 利用遞迴,dfs 此方法較動態規劃要好很多 基本思想 舉例子說明最容易理解,例如 nums 1,5,4,3,7 第一步 對陣列進行排序,nums 1,3,4,5,7 求出其和的一半 half 10 對於陣列中元...

LeetCode416 分割等和子集

主要的思想 於0 1揹包問題,解決方法是動態規劃。我們可以想到,把陣列分割成兩份,並且和相等,那麼每乙份的和是總和的一半。那麼問題就可以轉化為找到一組數,使得他們的和逼近sum 2,最後判斷最大的和是否等於sum 2,如果是則說明存在這樣的組合,也就是存在子集。其和為sum 2,當然了另乙個集合的和...

LeetCode416 分割等和子集

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