本文共 1022 字,大约阅读时间需要 3 分钟。
这么简单的一个问题,让我纠结了这么久,唉!
问题:从0到n-1这n个数中找出m个数的组合。
代码:
- #include<stdio.h>
- #include<vector>
- using namespace std;
- vector<int> S;
- vector<int>::iterator it;
- void fc(int n,int m,int p){
- if(m==0){
- it=S.begin();
- for(;it!=S.end();it++){
- printf("%d ",*it);
- }
- printf("\n");
- return;
- }
- for(int i=p;i<n;i++){
- S.push_back(i);
- fc(n,m-1,i+1);
- S.pop_back();
- }
- }
- int main(){
- fc(5,3,0); //n=5,m=3,从0开始,也可以选择从1开始
- return 0;
- }
程序输出:
- 0 1 2
- 0 1 3
- 0 1 4
- 0 2 3
- 0 2 4
- 0 3 4
- 1 2 3
- 1 2 4
- 1 3 4
- 2 3 4
再把问题深化一下,如果要求n个不同的数中取m个数的组合呢?直接把n个数存储在数组中就可以了,把刚才求得的值作为数组的下标就OK了!
- #include<stdio.h>
- #include<vector>
- using namespace std;
- vector<int> S;
- vector<int>::iterator it;
- int a[6]={1,2,3,4,5,6};
- void fc2(int n,int m,int p){
- if(m==0){
- it=S.begin();
- for(;it!=S.end();it++){
-
- printf("%d ",*(a+*it));
- }
- printf("\n");
- return;
- }
- for(int i=p;i<n;i++){
- S.push_back(i);
- fc2(n,m-1,i+1);
- S.pop_back();
- }
- }
- int main(){
- fc2(6,3,0);
- return 0;
- }
- 输出结果:
-
- 1 2 3
- 1 2 4
- 1 2 5
- 1 2 6
- 1 3 4
- 1 3 5
- 1 3 6
- 1 4 5
- 1 4 6
- 1 5 6
- 2 3 4
- 2 3 5
- 2 3 6
- 2 4 5
- 2 4 6
- 2 5 6
- 3 4 5
- 3 4 6
- 3 5 6
- 4 5 6
转载地址:http://uvwul.baihongyu.com/