給一 只含有正整數 的 非空 數組, 找到這個數組是否可以劃分爲 兩個 元素和相等的子集。
樣例
例1:
輸入: nums = [1, 5, 11, 5],
輸出: true
解釋:
two subsets: [1, 5, 5], [11]
例2:
輸入: nums = [1, 2, 3, 9],
輸出: false
注意事項
所有數組元素不超過100.
數組大小不超過200.
思路:先求出數組的總和,如果和是奇數的話,則不可能劃分爲相等的子集。
如果和是偶數的話,則取其一半,進行01揹包,看看和的一半能不能查找到即可
class Solution {
public:
/**
* @param nums: a non-empty array only positive integers
* @return: true if can partition or false
*/
bool canPartition(vector<int> &nums) {
// write your code here
int sum=0;
for (int i = 0; i < nums.size(); i++) {
sum+=nums[i];
}
if(sum%2) return false;
int half=sum/2;
vector<bool> dp(half+1,false);
dp[0]=true;
for (int i = 0; i < nums.size(); i++) {
for(int j = half;j>=nums[i];j--)
{
if(dp[j-nums[i]]) dp[j]=true;
}
}
return dp[half];
}
};