从集合n里选m个数

从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;
}

猜你喜欢

转载自blog.csdn.net/qq_34649947/article/details/80408580