C++递归求解N个元素的所有子集
2017-10-05 20:33
134 查看
这是之前视频面试时的一道编程题,题目是:求解N个元素的所有子集,如,输入{1,2,3},输出{1,2,3,12,13,23,123}
面试官要求十分钟内写出来,当时有点小紧张,对递归也不是太熟,所以只写了一半,没有完成。但是思路是有的,而且是正确的,在面试结束后,花了将近10分钟的时间,将程序写了出来,思路如下:
看到题目,很快就想到了使用递归回溯的方法,
先输出长度为1的所有子集:1 , 2, 3
输出长度为2的所有子集:12 , 13, 23
输出长度为3的所有子集:123
代码如下,自认为没什么问题了,第一次写,排版什么的都没做好,主要还是给自己做回顾用,如果有幸这篇文章被您所看到,有问题请不吝赐教。
面试官要求十分钟内写出来,当时有点小紧张,对递归也不是太熟,所以只写了一半,没有完成。但是思路是有的,而且是正确的,在面试结束后,花了将近10分钟的时间,将程序写了出来,思路如下:
看到题目,很快就想到了使用递归回溯的方法,
先输出长度为1的所有子集:1 , 2, 3
输出长度为2的所有子集:12 , 13, 23
输出长度为3的所有子集:123
代码如下,自认为没什么问题了,第一次写,排版什么的都没做好,主要还是给自己做回顾用,如果有幸这篇文章被您所看到,有问题请不吝赐教。
#include <iostream> #include <vector> using namespace std; int length,n; vector<vector<int>> ans; void find(vector<int> &a,vector<int> &t,int index){ if(t.size() == length){ //长度为指定长度时,保存到ans后,返回,结束这一次递归 ans.push_back(t); return; } for(int i=index;i<n;i++){ t.push_back(a[i]); find(a,t,i+1); t.pop_back(); //回溯 } } int main() { cin>>n; vector<int> a(n,0),t; for(int i=0;i<n;i++) cin>>a[i]; for(int i=1;i<=n;i++){ //长度递增 length++; find(a,t,0); } for(int i=0;i<ans.size();i++){ for(int j=0;j<ans[i].size();j++) cout<<ans[i][j]<<" "; cout<<endl; } return 0; }
相关文章推荐
- 求n个元素的所有子集
- 使用队列求解杨辉三角的第K层的所有元素
- 使用递归函数,输出n个元素的所有子集
- C语言递归求解集合的所有子集
- 使用递归函数,输出n个元素的所有子集
- 列出所有K个元素的子集
- [经典算法] 排列组合-N元素集合的所有子集(一)
- 回溯法求解数组中和为固定值的所有元素集合
- 写一个递归函数,用来输出n个元素的所有子集。
- 求m个元素集合中n个元素的所有子集(C/OC)
- 《数据结构、算法与应用》5.(递归输出n个元素的所有子集)
- 请编写一个递归函数,用来输出n个元素的所有子集。例如,三个元素{a,b,c}的所有子集是:{},{a},{b},{c},{a,c},{ac},{b,c},{a,b,c}.
- 递归求解从数组中取出n个元素的所有组合
- [经典算法] 排列组合-N元素集合的所有子集(二)
- 用递归算法返回该元素id下面的所有子集id
- n个元素的所有子集(递归+非递归 +不去重)
- 面试题: 已知一个含有n个不同元素的集合,要求打印其所有具有k个元素的子集(不允许有重复的)
- 有一个集合A,它又n个元素,请用回溯法输出它所有的子集。
- hdu 2062 输出第几个子集的所有元素
- http://projecteuler.net/problem=5【求解数组所有元素的最小公倍数】