给定一个含n个整数的数组 nums(1≤n≤20,0≤nums[i]≤1000)和一个整数s(-1000≤s≤1000)。向数组中的每个整数前添加'+'或'-',然后串联起所有整数,可以构造一个表达式,例如,nums={2,1},可以在2之前添加'+',在1之前添加'-',然后串联起来得到表达式 "+2-1"。输出满足条件的解的式子。
设计一个算法求可以通过上述方法构造的运算结果等于s的不同表达式的数目。
1 #include<vector> 2 #include<iostream> 3 using namespace std; 4 class Solution { 5 int ans=0; //存放解个数 6 vector<vector<int>>A; 7 vector<int>current_ans; 8 public: 9 int findTargetSumWays(vector<int>& nums,int s) { 10 dfs(nums,s,0,0); 11 return ans; 12 } 13 14 void dfs(vector<int>& nums,int s,int i,int expv) { 15 if (i==nums.size()) { //到达一个叶子结点 16 if(expv==s){ 17 ans++; 18 A.push_back(current_ans); 19 } //找到一个解 20 } 21 else { 22 current_ans.push_back(nums[i]); //nums[i]前选择'+' 23 dfs(nums,s,i+1,expv+nums[i]); 24 current_ans.pop_back(); //回溯 25 26 current_ans.push_back(-nums[i]); //nums[i]前选择'-' 27 dfs(nums,s,i+1,expv-nums[i]); 28 current_ans.pop_back(); //回溯 29 } 30 } 31 void printfAns(){ 32 for(const auto& a : A){ 33 for(const auto& num : a){ 34 if(num > 0) 35 cout << "+" ; 36 cout << num; 37 } 38 cout << "\n"; 39 } 40 } 41 42 }; 43 int main(){ 44 Solution solution; 45 vector<int>nums = {1, 2, 1, 2, 1}; 46 int target = 2; 47 cout << "符合条件的表达式共有" << solution.findTargetSumWays(nums,target) << "条:"; 48 solution.printfAns(); 49 return 0; 50 }
标签:nums,int,回溯,back,dfs,current,ans From: https://www.cnblogs.com/zyqdfp/p/18521254