題目來源
給一個數組,問能否把數組切分為兩組,這兩組元素的和是一樣的。
想著就應該用dp,然后沒想到怎么用,然后又看了下答案…其實也是蠻簡單的一道題。
首先求出數組和,若和為奇數,則false,否則求出sum的一半,進行遍歷。dp數組存儲的是數組中能否有元素和等于該索引,遍歷一遍元素,然后每次遍歷到某個元素的時候都更新dp數組。
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum & 1 == 1)
return false;
int target = sum >> 1, n = nums.size();
vector<int> dp(target+1, 0);
dp[0] = 1;
for (auto num : nums)
for (int i=target; i>=num; i--)
dp[i] = dp[i] || dp[i-num];
return dp[target];
}
};