首页 > 其他分享 >回溯法1

回溯法1

时间:2024-11-01 21:01:01浏览次数:1  
标签:nums int 回溯 back dfs current ans

给定一个含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

相关文章

  • ”回溯算法“框架及练习题
    @目录一、回溯算法是什么?二、框架如下:本人其他文章链接一、回溯算法是什么?结论:回溯=穷举解决一个回溯问题,实际上就是一个决策树的遍历过程路径:就是已经做出的选择选择列表:就是你当前可以做出的选择结束条件:就是basecase条件,也就是临界条件二、框架如下:框架如下:resu......
  • 算法设计与分析中的几个核心算法策略:动态规划、贪心算法、回溯算法和分治算法
    这些题目主要考察的是算法设计与分析中的几个核心算法策略:动态规划、贪心算法、回溯算法和分治算法。下面我将分别介绍这些知识点,并解析题目的详细解答过程。1.动态规划(DynamicProgramming,DP)知识点介绍:动态规划是一种通过把原问题分解为相对简单的子问题的方式来求解复杂问......
  • 回溯——3,5升杯倒4升水
    目录名称接前面书上说数学浅谈最大公约数gcd(a,b)=x∗a+y∗bgcd(a,b)=x*a+y*bgcd(a,b)=x∗a+y∗bC(3,2)=6C(3,2)=6C(3,2)=6只要一杯8升水代码一般回溯方法的程序结构打印接前面递归的改造——间隔挑硬币打印所挑选......
  • 【回溯算法】(第七篇)
    目录⼦集(medium)题目解析讲解算法原理编写代码找出所有⼦集的异或总和再求和(easy)题目解析讲解算法原理编写代码⼦集(medium)题目解析1.题目链接:.-力扣(LeetCode)2.题目描述给你⼀个整数数组nums,数组中的元素互不相同。返回该数组所有可能的⼦集(幂集)。解集不能包......
  • 【数据结构与算法】《Java 算法宝典:探秘从排序到回溯的奇妙世界》
    目录标题:《Java算法宝典:探秘从排序到回溯的奇妙世界》一、排序算法1、冒泡排序2、选择排序3、插入排序4、快速排序5、归并排序二、查找算法1、线性查找2、二分查找三、递归算法四、动态规划五、图算法1.深度优先搜索(DFS)2.广度优先搜索(BFS)六、贪心算法七、分治算法......
  • 算法汇总整理篇——回溯与图论的千丝万缕及问题的抽象思考
    回溯算法(重中之重)回溯法解决的问题都可以抽象为树形结构,集合的大小就构成了树的广度,递归的深度就构成了树的深度。(回溯的核心:分清楚什么数据作为广度,什么数据作为深度!!!!!)voidbacktracking(参数){if(终止条件){存放结果;return;}for......
  • 回溯法解决图着色问题
    此为课题组所指导本科生和低年级硕士生学习组合优化问题汇报所用教材:北京大学屈婉玲教授《算法设计与分析》课程资料:https://www.icourse163.org/course/PKU-1002525003承诺不用于任何商业用途,仅用于学术交流和分享更多内容请关注许志伟课题组官方中文主页:https://JaywayXu.g......
  • 刷题总结——回溯算法
    总论增量构造答案关注边界条件的逻辑当前操作?(选/不选,枚举选哪一个)子问题?下一个子问题?用什么数据结构保存搜索路径?时间复杂度计算:搜索树节点数*生成答案需要的时间题目分类可以分成子集型、排列型和组合型三种:回溯问题时间复杂度O()解法子集LC78nx2^n......
  • 代码随想录算法训练营第二十四天|Day24 回溯算法
    93.复原IP地址题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/思路char**result;intresultTop;intsegments[3];intisValid(char*s,intstart,intend){......
  • 回溯法求解简单组合优化问题
    此为课题组所指导本科生和低年级硕士生学习组合优化问题汇报所用教材:北京大学屈婉玲教授《算法设计与分析》课程资料:https://www.icourse163.org/course/PKU-1002525003承诺不用于任何商业用途,仅用于学术交流和分享更多内容请关注许志伟课题组官方中文主页:https://JaywayXu......