从n 个中取m个,比如1234,中取三个,每次试探着选当前,可以选或者不选,直到从n中选到满足m个就输出一种情况;以下是结果
1 2 3
1 2 4
1 3 2
1 3 4
1 4 2
1 4 3
2 1 3
2 1 4
2 3 1
2 3 4
2 4 1
2 4 3
3 1 2
3 1 4
3 2 1
3 2 4
3 4 1
3 4 2
4 1 2
4 1 3
4 2 1
4 2 3
4 3 1
4 3 2
代码如下:
//从集合n里选m个数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
int re[6] = {0, 1, 2, 3, 4};//假设原来集合里有{1, 2, 3, 4, 5}
int record[6];//从集合里取三个(不重复)
int ans = 0;
int vis[10];
void dfs(int dp) {
if (dp == 4) {
for (int i = 1; i <= 3; i++) {
cout << record[i] << " ";
}
ans++;
cout << endl;
return;
}
for (int i = 1; i <= 4; i++) {
if (vis[i] == 0) {
record[dp] = re[i];
vis[i] = 1;
dfs(dp+1);
vis[i] = 0;
}
}
}
int main() {
memset(vis, 0, sizeof(vis));
dfs(1);
cout << endl;
cout << ans << endl;
return 0;
}
但是你会发现,123, 312, 213,这种的如果不区分取得顺序的话,是一样的;
因此可以用以下代码来求:
//从集合n里选m个数, 不重复的意思就是1 2 3, 和 3 2 1 看做同一种
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
int re[6] = {0, 1, 2, 3, 4, 5};//假设原来集合里有{1, 2, 3, 4, 5}
int record[6];//从集合里取三个(不重复)
int ans = 0;
void dfs(int k, int num) {
if (num == 3) {
for (int i = 1; i <= 3; i++) {
cout << record[i] << " ";
}
ans++;
cout << endl;
return;
}
for (int i = k + 1; i <= 5; i++) {
record[num+1] = re[i];
dfs(i, num+1);
}
}
int main() {
for (int i = 1; i <= 5; i++) {
record[1] = i;
dfs(i, 1);
}
cout << endl;
cout << ans << endl;
return 0;
}