求A(n,m)
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int n,m;
vector<int> inp;
int check(vector<int>& ans,int rng){
set<int> che;
for(int i=0;i<=rng;i++){
che.insert(ans[i]);
}
if(che.size()==rng+1){
return 1;
}
return 0;
}
void dfs(int pos,int depth,vector<int>& ans){
if(depth==m){
for(int i=0;i<m;i++){
cout<<ans[i];
}
cout<<endl;
return;
}
for(int i=0;i<n;i++){
ans[depth]=inp[i];
if(check(ans,depth)){
dfs(i+1,depth+1,ans);
}
}
}
int main(){
cin>>n>>m;
if(n<m){
cout<<"error"<<endl;
return 0;
}
int tmp;
for(int i=0;i<n;i++){
cin>>tmp;
inp.push_back(tmp);
}
vector<int> ans(n,0);
dfs(0,0,ans);
return 0;
}
递归法全排列
#include <string>
#include <algorithm>
using namespace std;
void perm(string str, int start, int end) {
if (start == end) {
for (int i = 0; i <= end; i++)
cout << str[i];
cout << endl;
}
else
{
for (int j = start; j <= end; j++) {
swap(str[j], str[start]);
perm(str, start + 1, end);
swap(str[j], str[start]);
}
}
}
STL全排列
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int nums[10];
for( int i = 0; i < 10; i++ ) {
nums[i] = i + 1;
}
int t, n;
cin >> t;
while( t-- ) {
cin >> n;
do {
for( int i = 0; i < n; i++ ) {
cout << nums[i];
}
cout << endl;
} while( next_permutation( nums, nums+n ) );
}
return 0;
}
求C(n,k)
void dfs(int pos,int depth,vector<int>& ans){
if(depth==m){
for(int i=0;i<m;i++){
cout<<ans[i];
}
cout<<endl;
return;
}
for(int i=pos;i<n;i++){
ans[depth]=inp[i];
dfs(i+1,depth+1,ans);
}
}
int main(){
cin>>n>>m;
if(n<m){
cout<<"error"<<endl;
return 0;
}
int tmp;
for(int i=0;i<n;i++){
cin>>tmp;
inp.push_back(tmp);
}
vector<int> ans(n,0);
dfs(0,0,ans);
return 0;
}