其实组合数就是从小到大单调递增的排列数
排列数
//A_n_n
#include<iostream>
#include<algorithm>
using namespace std;
const int ma = 1000;
int a[ma];
bool hasht[ma] = { false };
int count1 = 0;
int n, k;///n中取k个数,哈哈因为是全排列所以这里n=k;
void dfs(int x) {
if (x == n) {
for (int i = 0;i < k - 1;i++) {
cout << a[i] << " ";
}
count1++;
cout << a[k - 1] << endl;
return;
}
for (int i = 1;i <= n;i++) {
if (!hasht[i]) {
a[x] = i;
hasht[i] = true;
dfs(x + 1);
hasht[i] = false;
}
}
}
int main() {
cin >> n >> k;
dfs(0);
cout << count1 << endl;
return 0;
}```
*stl实现全排列*
```cpp
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int a[5] = { 1,2,3,4,5 };
do {
for (int i = 0;i < 4;i++) {
cout << a[i] << " ";
}
cout << a[4] << endl;
} while (next_permutation(a, a + 5));
return 0;
}
//A_n_k
#include<iostream>
#include<algorithm>
using namespace std;
const int ma = 1000;
int a[ma];
bool hasht[ma] = { false };
int count1 = 0;
int n, k;///n中取k个数
void dfs(int x) {
if (x == k) {
for (int i = 0;i < k - 1;i++) {
cout << a[i] << " ";
}
count1++;
cout << a[k - 1] << endl;
return;
}
for (int i =1;i <= n;i++) {
if (!hasht[i]) {
a[x] = i;
hasht[i] = true;
dfs(x + 1);
hasht[i] = false;
}
}
}
int main() {
cin >> n >> k;
dfs(0);
cout << count1 << endl;
return 0;
}
组合数
//C_n_k
#include<iostream>
#include<algorithm>
using namespace std;
const int ma = 1000;
int a[ma];
bool hasht[ma] = { false };
int count1 = 0;
int n, k;///n中取k个数
void dfs(int x,int y) {
if (x==k) {
for (int i = 0;i < k-1;i++) {
cout << a[i] << " ";
}
count1++;
cout << a[k-1] << endl;
return;
}
for (int i = y;i <= n;i++) {//只有这一步与全排列有区别,相当于给全排列强行规定顺序,不符合顺序的直接不输出.
if (!hasht[i]) {
a[x] = i;
hasht[i] = true;
dfs(x + 1, i + 1);
hasht[i] = false;
}
}
}
int main() {
cin >> n >> k;
dfs(0,1);
cout << count1 << endl;
return 0;
}