当前位置: 首页 > news >正文

C++算法练习-day54——39.组合总和

题目来源:. - 力扣(LeetCode)

题目思路分析

题目:给定一个整数数组 candidates 和一个目标数 target,找出所有独特的组合,这些组合中的数字之和等于 target。每个数字在每个组合中只能使用一次。

思路

  1. 回溯法:回溯法是一种通过探索所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化来丢弃该解,即“回溯”并尝试另一个可能的候选解。

  2. 剪枝:在回溯过程中,如果当前组合的和已经超过了目标值 target,则可以提前终止当前路径的搜索,因为后续添加任何数字都会使总和更大。(题目中已说明candidates中的数都大于1)

代码:

#include <vector>  class Solution {  
public:  // 回溯函数  void Backtracking(vector<vector<int>>& ans, vector<int>& pos, vector<int>& candidates, int target, int index, int& possum) {  // 如果当前组合的和超过了目标值,直接返回  if (possum > target) {  return;  }  // 如果当前组合的和等于目标值,将当前组合加入结果集  if (possum == target) {  ans.push_back(pos);  }  // 遍历候选数组,从当前索引开始(因为每个数字只能使用一次)  for (; index < candidates.size(); ++index) {  // 选择当前数字  possum += candidates[index];  pos.push_back(candidates[index]);  // 递归调用回溯函数,继续向下搜索  Backtracking(ans, pos, candidates, target, index + 1, possum);  // 撤销选择,回溯  possum -= candidates[index];  pos.pop_back();  }  }  // 主函数,调用回溯函数  vector<vector<int>> combinationSum(vector<int>& candidates, int target) {  vector<int> pos; // 当前组合  vector<vector<int>> ans; // 结果集  int possum = 0; // 当前组合的和  // 调用回溯函数,从索引0开始搜索  Backtracking(ans, pos, candidates, target, 0, possum);  return ans;  }  
};

知识点摘要

  1. 回溯法:一种通过递归和状态重置来构建所有可能解的算法。
  2. 剪枝:在搜索过程中提前终止不可能产生有效解的路径,以减少计算量。
  3. 状态重置:在回溯过程中,通过撤销选择来回到之前的状态,以便尝试其他可能的解。

通过这道题目,我们学习了如何使用回溯法来解决组合问题,并理解了剪枝和状态重置的重要性。回溯法是一种强大的算法,适用于解决许多组合和排列问题。在实际应用中,我们需要注意如何有效地进行剪枝,以减少不必要的计算,提高算法的效率。此外,对于涉及组合的问题,如果数组已排序,可以进一步简化问题,避免产生重复的组合。通过不断练习,我们可以更好地掌握回溯法的应用,提高解决复杂问题的能力。

http://www.lryc.cn/news/495339.html

相关文章:

  • 计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
  • Linux的文件系统
  • 【Vue3】从零开始创建一个VUE项目
  • 9)语法分析:半倒装和全倒装
  • Scala关于成绩的常规操作
  • 使用Java实现度分秒坐标转十进制度的实践
  • 根据后台数据结构,构建搜索目录树
  • 食品计算—FoodSAM: Any Food Segmentation
  • 2411rust,1.83
  • tomcat加载三方包顺序
  • 计算机的错误计算(一百七十一)
  • js对于json的序列化、反序列化有哪几种方法
  • Linux——基础命令(2) 文件内容操作
  • 简单搭建qiankun的主应用和子应用并且用Docker进行服务器部署
  • Python知识分享第十六天
  • 管家婆财贸ERP BR045.大类存货库存数量明细表
  • Pytorch-GPU版本离线安装
  • k8s 1.28 二进制安装与部署
  • 【C语言】扫雷游戏(一)
  • 二分法篇——于上下边界的扭转压缩间,窥见正解辉映之光(1)
  • # 01_Python基础到实战一飞冲天(三)--python面向对象(一)--简单类
  • sentinel使用手册
  • 搜索二维矩阵 II(java)
  • Python语法基础(四)
  • 03_Django视图
  • 如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件
  • 11 设计模式之代理模式(送资料案例)
  • MongoDB聚合操作
  • 第二十三周周报:High-fidelity Person-centric Subject-to-Image Synthesis
  • Cesium 与 Leaflet:地理信息可视化技术比较