回溯傻搜
class Solution {
public:
long long count = 0;
int findTargetSumWays(vector<int>& nums, int S) {
dfs(nums,0,S);
return count;
}
void dfs(vector<int>& nums, int index, long long S){
if(index==nums.size()){
if(S==0) count++;
return;
}
dfs(nums,index+1,S+nums[index]);
dfs(nums,index+1,S-nums[index]);
}
};
如果直接按照01背包的想法动态规划,会遇到一个困难,就是该如何递推
这里用到了一个转化的方法。
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
int sum = 0, n = nums.size();
for(auto num:nums) sum+=num;
if(sum<S) return 0;
if((sum+S)%2) return 0;
int target = (sum+S)/2;
vector<vector<int>> dp(n+1,vector<int>(target+1));
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=target;j++){
dp[i][j] = dp[i-1][j];
if(j>=nums[i-1]){
dp[i][j] = dp[i-1][j] + dp[i-1][j-nums[i-1]];
}
}
}
return dp[n][target];
}
};