使用遞歸方法
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
int res=0;
find(nums,S,0,res);
return res;
}
void find(vector<int>& nums, int S, int start, int& res){
if(start >= nums.size()){
if(!S) res++;
return;
}
find(nums,S-nums[start],start+1,res);
find(nums,S+nums[start],start+1,res);
}
};
使用dp 方法 推到公式,sum(A)-sum(B)=S, 2*sum(A)=S+sum(A)+sum(B) = S+ SUM
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum < S || ((S + sum) & 0x1 == 1)) { // 判斷奇數
return 0;
}
int target = (S + sum) >> 1;
vector<int> dp(target + 1, 0);
dp[0] = 1;
for (auto num : nums) {
for (int i = target; i >= num; --i) {
dp[i] += dp[i - num];
}
}
return dp[target];
}
};