0

n 値のベクトルがあるとします。たとえば、その値のさまざまな組み合わせを取得したいとします。vect = [a, b, c] の場合、必要なさまざまな組み合わせは [a, b, c] です。 、[a,b]、[a,c]、[b,c]、[a]、[b]、[c]

たとえば [a,b] は [b,a] と同じなので、両方を保持する必要はありません。

4

3 に答える 3

6

0からまで数え2^vector.size() - 1ます。ループ変数のビットiが1の場合はvector[i]、組み合わせに含めます。

vector<char> v;
v.push_back('a');
v.push_back('b');
v.push_back('c');
for (int counter = 0; counter < (1 << v.size()); ++counter)
{
    vector<char> combination;
    for (int i = 0; i < v.size(); ++i)
    {
        if (counter & (1 << i))
            combination.push_back(v[i]);
    }

    // do something with combination
}

編集:空のセットを除外する場合は、1からカウントを開始します。

于 2012-04-26T10:07:17.623 に答える
0

すでにこれを実行できる関数があると想像してください。と呼びましょうcombinations

これの独自のバージョンを実装する場合はmy_combinations、ベクトルの最初の要素を調べ、残りのベクトルを呼び出しcombinations、要素を各組み合わせで結合することで実行できます。

combinationsこれを実装すると、既存のバージョンを使用する代わりに、独自のバージョンの に委任できます。

于 2012-04-26T11:54:31.357 に答える
0

疑似コードを渡して、実際のコードに変換してください。

vector resultVec;
while (!inputVec.empty)
{
    char c = inputVec.pop_back();

    foreach(one in resultVec)
    {
         combined = combine c and one;
         resultVec.push_back(combined);
    }

    resultVec.push_back(c);
}
于 2012-04-26T10:30:47.267 に答える