一、题目描述

二、解题思路
整体思路
画出本题的决策树,可以采用回溯的方法来解决这个问题。
具体思路
(1)函数功能:dfs函数用于统计从start开始,表达式值为target的表达式的所有个数;
(2)递归出口:当start等于nums.size()时,若表达式的值为target,则ret++。不论表达式的值是否为target,都需要返回;
(3)函数体:当前位置要么选择'+',要么选择'-',根据这两种情况来解决
<1>选择'+',path+=nums[i],dfs处理后一个位置,处理完后恢复现场;
<2>选择'-',path+=nums[i],dfs处理后一个位置,处理完后恢复现场;
注意:只有修改了全局变量的值,才需要进行回溯恢复现场。
三、代码实现
cpp
class Solution {
int ret=0;
int path=0;
public:
int findTargetSumWays(vector<int>& nums, int target) {
dfs(nums,0,target);
return ret;
}
void dfs(vector<int>& nums,int start,int target){
//递归出口
if(start==nums.size()){
if(path==target){
ret++;
}
return ;
}
//选'+'
path+=nums[start];
dfs(nums,start+1,target);
//恢复现场
path-=nums[start];
//选'-'
path-=nums[start];
dfs(nums,start+1,target);
//恢复现场
path+=nums[start];
}
};