我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++回溯算法中组合的相关问题怎么解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++回溯算法中组合的相关问题怎么解决

这篇文章主要讲解了“C++回溯算法中组合的相关问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++回溯算法中组合的相关问题怎么解决”吧!

回溯算法模板

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }
    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

回溯问题,最关键的是画出二叉树,遍历、剪枝问题都要通过直观的观察才能总结

一、组合

剪枝策略

已经选择的元素个数:path.size();

还需要的元素个数为: k - path.size();

在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历

class Solution {private:    vector<vector<int>> result;    vector<int> path;    void backtracking(int n,int k,int startIndex){        if(path.size()==k){            result.push_back(path);            return;        }        for(int i=startIndex;i<=n-(k-path.size())+1;i++){            path.push_back(i);            backtracking(n,k,i+1);            path.pop_back();        }    }public:    vector<vector<int>> combine(int n, int k) {        backtracking(n,k,1);        return result;    }};

二、组合总和III与组合总和

1.组合总和III

在组合的基础上,多了一个求和的操作,求和也可以剪枝

class Solution {private:    vector<vector<int>> result;    vector<int> path;    void backtracking(int sum,int k,int n,int startIndex){        if(sum>n) return;        if(path.size()==k){            if(sum==n) result.push_back(path);            return;        }        for(int i=startIndex;i<=9-(k-path.size())+1;i++){            path.push_back(i);            sum+=i;            backtracking(sum,k,n,i+1);            sum-=i;            path.pop_back();        }    }public:    vector<vector<int>> combinationSum3(int k, int n) {        backtracking(0,k,n,1);        return result;    }};

2.组合总和

本题与组合III的区别在于,不限制组合内数字的个数,且同一个数字可以无限制重复被选取,体现在代码上就是,向下递归的时候,i不变

class Solution {private:    vector<int> path;    vector<vector<int>> result;    void backtracking(vector<int>& candidates, int target,int index,int sum){        if(sum>target) return;        if(sum==target){            result.push_back(path);            return;        }        for(int i=index;i<candidates.size();i++){            path.push_back(candidates[i]);            sum+=candidates[i];            backtracking(candidates,target,i,sum);            sum-=candidates[i];            path.pop_back();        }    }public:    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {        backtracking(candidates,target,0,0);        return result;    }};

3.组合总和II

本题和组合总和的区别在于,输入样例中含有重复元素时,输出样例不能有重复元素

同一条枝干上,元素可以相同;而不同的枝干则不能重复

即:横向遍历不能重复、纵向遍历可以重复

class Solution {private:    vector<int> path;    vector<vector<int>> result;    void backtracking(vector<int>& candidates, int target,int index,int sum){        if(sum>target) return;        if(sum==target){            result.push_back(path);            return;        }        for(int i=index;i<candidates.size();i++){            if(i>index&&candidates[i]==candidates[i-1])                continue;            path.push_back(candidates[i]);            sum+=candidates[i];            backtracking(candidates,target,i+1,sum);            sum-=candidates[i];            path.pop_back();        }    }public:    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {        sort(candidates.begin(),candidates.end());        backtracking(candidates,target,0,0);        return result;    }};

三、电话号码的字母组合

这题很好的考察了:for循环横向遍历、递归纵向遍历的知识点

class Solution {private:    const string letterMap[10]={        "",        "",        "abc",        "def",        "ghi",        "jkl",        "mno",        "pqrs",        "tuv",        "wxyz"    };public:    string path;    vector<string> result;    void backtracking(string digits,int index){        if(index==digits.size()){            result.push_back(path);            return;        }        int digit=digits[index]-'0';        string letter=letterMap[digit];        for(int i=0;i<letter.size();i++){            path.push_back(letter[i]);            backtracking(digits,index+1);            path.pop_back();        }    }    vector<string> letterCombinations(string digits) {        if(digits.size()==0)            return result;        backtracking(digits,0);        return result;    }};

感谢各位的阅读,以上就是“C++回溯算法中组合的相关问题怎么解决”的内容了,经过本文的学习后,相信大家对C++回溯算法中组合的相关问题怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++回溯算法中组合的相关问题怎么解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++回溯算法中组合的相关问题怎么解决

这篇文章主要讲解了“C++回溯算法中组合的相关问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++回溯算法中组合的相关问题怎么解决”吧!回溯算法模板void backtracki
2023-07-05

C++回溯算法中组合的相关问题分析

回溯算法并不是什么高效的算法,因为本质上时去遍历所有元素,找出所有可能,然后选出需要的答案。那为什么还要回溯法,简单来说,不是所有的问题都能用什么巧妙的方法来解决的
2023-03-15

C++回溯算法中的全排列问题怎么解决

本文小编为大家详细介绍“C++回溯算法中的全排列问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++回溯算法中的全排列问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、全排列全排列的特点
2023-07-05

C++回溯算法中子集问题如何解决

这篇文章主要介绍了C++回溯算法中子集问题如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++回溯算法中子集问题如何解决文章都会有所收获,下面我们一起来看看吧。一、子集子集问题与其它问题最大的不同就是:
2023-07-05

C语言中的运算符和结合性问题怎么解决

本文小编为大家详细介绍“C语言中的运算符和结合性问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言中的运算符和结合性问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。C语言运算符和结合性优
2023-07-05

java高级用法之JNA中的回调问题怎么解决

今天小编给大家分享一下java高级用法之JNA中的回调问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。简介什么是c
2023-06-30

C++中vector和数组之间的转换及其效率问题怎么解决

本文小编为大家详细介绍“C++中vector和数组之间的转换及其效率问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++中vector和数组之间的转换及其效率问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
2023-07-05

springboot中关于继承WebMvcConfigurationSupport后自定义的全局Jackson失效解决方法,localdate返回数组问题

一般情况下我们在config里增加jackson的全局配置文件就能满足基本的序列化需求,比如前后端传参的问题。 @Configurationpublic class JacksonConfig { public static fina
2023-08-30

怎么解决电脑中提示依赖服务或组无法启动的问题

小编给大家分享一下怎么解决电脑中提示依赖服务或组无法启动的问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1.调出运行窗口,直接输入msconfig命令后回车打开。2.出现对应的系统配置界面后,直接将鼠标切换至“服务”选
2023-06-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录