回溯法能解决的另一个重要的问题就是组合问题
题目
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
2 4
3 4
2 3
1 2
1 3
1 4
#include <iostream>
#include <vector>
using namespace std;
int n,k;
//求解C(n,k),当前已经找到的元素放在ans中,从start开始搜素新的元素
void Combination( vector<int> ans,int start )
{
if( ans.size()==k )
{
for( int i = 0 ; i < k ; i++)
{
cout << ans[i];
if( i==k-1 ) cout << endl;
else cout << " ";
}
return;
}
//还有k-ans.size()个空间可取,[i...n]中至少要有这么多个元素,否则就直接return;
//n-i+1>=k-ans.size(); --> i<=n-(k-ans.size())+1
for( int i = start ; i <= n-(k-ans.size())+1 ; i++ )
{
ans.push_back(i);
Combination( ans,i+1 );
ans.pop_back();
}
}
int main(){
cin >> n >> k;
vector<int> ans;
Combination( ans,1 );
return 0;
}