Print power set (DFS)

来源:互联网 发布:威海市南海新区知乎 编辑:程序博客网 时间:2024/06/14 20:45

今天无意间看到一道题,基本的数学组合题,但平常都不怎么注意,遂记录下来。

题目来源

题目描述

Print all combinations of a set. for example, there is an array {1, 2, 3}, its power set is:

{#}
{1} {2} {3}
{1, 2} {1, 3} {2, 3}
{1, 2, 3}

DFS解法

void DFS(vector<int>&vec, vector<vector<int>>& res, vector<int>& tmp, int len, int index) {    if (index >= len) {        res.push_back(tmp);        return;    }    tmp.push_back(vec[index]);    DFS(vec, res, tmp, len, index + 1);    tmp.pop_back();    DFS(vec, res, tmp, len, index + 1);}vector<vector<int>> getPowerSet(vector<int>& vec) {    vector<vector<int>> res;    if (vec.empty()) return res;    int len = vec.size();    vector<int> tmp;    DFS(vec, res, tmp, len, 0);    return res;}int main() {    vector<int> vec = {1, 2, 3};    auto ans = getPowerSet(vec);    for (auto &item : ans) {        for (auto &num : item) cout << num <<  " " ;        cout << endl;    }}

BITMAP解法

void getPowerSet(vector<int>& vec) {    int len = vec.size();    int total = 1 << len;    for (int i = 0; i < total; ++i) {        for (int j = 0; j < len; ++j) {            if (i & (1 << j)) {                // push_back or print                cout << vec[j] << " ";            }        }        cout << endl;    }}

bitmap的思想在这道题上体现得淋漓尽致。值得好好回味。在以后的处理组合问题上,可以利用这种思想。

原创粉丝点击