2010 年中兴面试题
编程求解:
输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中 随意取几个数 ,
使其和等于 m ,要求将其中所有的可能组合列出来.
分析:
可以使用递归思想, 从第n个数开始找其组合,
1)包括n的所有组合
2)不包括n的所有组合
把所有组合整合起来就OK了。
下面来看具体的实现:
#include<iostream> #include<vector> #include<set> #include<math.h> using namespace std; void Getmsets(int n, int m, vector<vector<int> >&allsets) { if(n < 1 || m < 1) return; if(m > n*(n+1)/2) return;//n too small if(n > m) n = m; vector<int> _vecset; if(n == m) { _vecset.push_back(n); allsets.push_back(_vecset); Getmsets(n-1, m, allsets); } else { vector<vector<int> > _vecvecsets; //包括n的情况 Getmsets(n, m -n, _vecvecsets); vector<vector<int> >::iterator itvecvec; for(itvecvec = _vecvecsets.begin(); itvecvec != _vecvecsets.end(); ++ itvecvec) { itvecvec->push_back(n); allsets.push_back(*itvecvec); } _vecvecsets.clear(); //不包括n的情况 Getmsets(n-1, m, _vecvecsets); for(itvecvec = _vecvecsets.begin(); itvecvec != _vecvecsets.end(); ++ itvecvec) { allsets.push_back(*itvecvec); } } } int main() { vector<vector<int> > vecvecres; Getmsets(10, 10, vecvecres); cout << "n = 10, m = 10, 所有的组合为:" << endl; vector<vector<int> >::iterator itvecvec; for(itvecvec = vecvecres.begin(); itvecvec != vecvecres.end(); ++ itvecvec) { for(vector<int>::iterator itvec = itvecvec->begin(); itvec != itvecvec->end(); ++itvec) { cout << *itvec << ","; } cout << endl; } return 0; }
输出结果为:n = 10, m = 10, 所有的组合为:
10,
1,9,
2,8,
3,7,
1,2,7,
4,6,
1,3,6,
5,5,
1,4,5,
2,3,5,
2,4,4,
3,3,4,
1,2,3,4,
19. 中兴面试题:输入两个整数n和m, 从数列1,2,...,n中任意选择几个数,使其和等于m, 要求编写程序输出所有的组合
最新推荐文章于 2024-08-08 16:43:27 发布