算法题(172):组合型枚举
审题本题需要我们对1到n的数进行n中取m的组合枚举找到所有不同的组合并按照字典序输出要求行内和行间都满足字典序思路本题我们采用枚举的方法但是用for循环暴力枚举会有两个大问题其一是无法确定for循环个数因为我们要取m次而m是题目给的我们事先无法知道其二是较难进行字典序排序输出其三是for循环层数可能极大会超时所以我们采用深度优先搜索的方法进行枚举方法一深度优先搜索我们先分析选取过程与方法我们以从1~4中选三个数的情况为例对于第一个空位我们可以填写1,2,3,4对于已经选了1的第二个空位我们可以填写2,3,4对于已经选了2的第二个空位我们可以填写3,4对于已经选了3的第二个空位我们可以填写4对于已经选了4的第二个空位我们不可以填写直接返回不输出.......发现1.我们需要从前面填写过的数的下一个数开始填写且这个数的填写顺序是字典序从小到大eg前面有了14_,后面如果填写41_会出现重复而我们需要的是组合不是排列字典序从小到大是为了让行内满足字典序要求2.当无法插入足够个数的数时直接return不输出3.当插入个数等于m时按格式输出数据并返回解题#includeiostream #includevector using namespace std; int n, m; vectorint path;//记录数据 void dfs(int begin) { if (path.size() m) { for (auto e : path) cout e ; cout endl; return; } for(int i begin; i n; i) { path.push_back(i);//插入当前层选取数据 dfs(i 1);//进入更深一层搜索 path.pop_back();//数据回溯 } } int main() { cin n m; dfs(1);//搜索 return 0; }注意1.使用vector进行数据记录的好处不用在dfs中传递待插入位置的索引可以直接使用push_back()接口进行数据插入使用pop_back()接口进行数据弹出回溯。且还可以直接根据path的size判断是否插入足够数据2.由于我们要知道当前层是从哪个数开始放置所以一定要传一个begin给dfs函数P10448 组合型枚举 - 洛谷
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2589671.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!