已知是個揹包問題,由於可以等分為兩部分,所以必定是個偶數。
一開始想到的是回溯法
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...