回溯法方法以及例题(组合问题+排列问题) | 您所在的位置:网站首页 › 三个人互相问好是不是组合问题呀 › 回溯法方法以及例题(组合问题+排列问题) |
回溯法方法以及例题(组合问题+排列问题)
方法模板框架
回溯函数模板返回值以及参数一般要根据题目的要求来进行编写,这里要注意的是参数一定是贯穿每层递归时要用到的值。 回溯函数终止条件既然是树形结构,遍历树形结构也就一定要有终止条件。所以回溯也有要终止条件。 回溯搜索的遍历过程这个可以结合树形结构来进行理解。 回溯法解决的问题都可以抽象为树形结构。 回溯算法模板框架如下: void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { 处理节点; backtracking(路径,选择列表); 递归回溯,撤销处理结果; } } 例题:组合是不强调元素顺序的,排列是强调元素顺序。例如:{1, 2} 和 {2, 1} 在组合上,就是一个集合,因为不强调顺序,而要是排列的话,{1, 2} 和 {2, 1} 就是两个集合了。记住组合无序,排列有序,就可以了。 组合问题:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。 示例:输入: n = 4, k = 2 输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 一开始还不太了解回溯算法的小伙伴可能会使用简单暴力的算法来试一下:从简单变成困难,所以就可以按示例来做一下,找找感觉,说不定就找到突破点了。 于是就有了如下代码: #include using namespace std; int main() { int n=4,k=2; for(int i=1;i if(k==some.size())//结束条件 { all.push_back(some);//属于符合条件的存入 return;//退出递归 } for(int i=start;i digui(1); //这里还可以顺便复习一下vector的输出方法的其中一种 for(vector::iterator it = all.begin();it != all.end();it++) { for(vector::iterator it0 = (*it).begin();it0 != (*it).end();it0++) cout if(some.size()==nums.size())//结束条件 { all.push_back(some);//属于符合条件的存入 return;//退出递归 } for(int i=0; i digui(nums,used); //这里还可以顺便复习一下vector的输出方法的其中一种 for(vector::iterator it=all.begin();it!=all.end();it++) { for(vector::iterator it0=(*it).begin();it0!=(*it).end();it0++) cout |
CopyRight 2018-2019 实验室设备网 版权所有 |