Sari la conținut
LECȚIA 15.2 · INFORMATICĂ

Generarea submulțimilor și numărarea soluțiilor

Vectorul caracteristic, ordinea generării și formulele de numărare cerute la grile.

Conținut verificat

Vectorul caracteristic

O submulțime a mulțimii {1..n} = un șir de n biți: bitul i spune dacă elementul i APARE (1) sau NU (0).

Pentru n = 3, cele 23=82^3 = 8 submulțimi, în ordinea numărării binare:

bițisubmulțimea
000∅
001{3}
010{2}
011{2,3}
100{1}
101{1,3}
110{1,2}
111{1,2,3}

Formulele de numărare (setul complet de grile)

  1. submulțimi ale unei mulțimi cu n elemente: 2n2^n (cu tot cu ∅);
  2. submulțimi NEVIDE: 2n−12^n - 1;
  3. submulțimi cu EXACT k elemente: CnkC_n^k;
  4. cuvinte de lungime k din n simboluri (cu repetiție): nkn^k;
  5. permutări: n!n!; aranjamente: AnkA_n^k.

Exemplu. Câte submulțimi cu cel puțin 2 elemente are {1,2,3,4}? 24−1−C41=16−1−4=112^4 - 1 - C_4^1 = 16 - 1 - 4 = 11.

"A câta soluție este...?" (tiparul de subiect)

Generarea pe vector caracteristic urmează NUMĂRAREA BINARĂ: submulțimea {1,3} pentru n=3 are biții 101 = 5 în binar → e a 6-a generată (numărând de la ∅ = prima). Invers: a 7-a soluție are indicele 6 = 110 → {1,2}.

Backtracking pe subprograme (recunoaștere)

Schema generică: la pasul k alegi o valoare validă, avansezi; când nu mai există valori, REVII la pasul k-1. Grilele cer de obicei doar: numărul de soluții, a k-a soluție, sau soluția anterioară/următoare uneia date: toate rezolvabile cu ordinea lexicografică, fără a "rula" programul.

Exemplu. Permutările lui {1,2,3} în ordine: 123, 132, 213, 231, 312, 321. Anterioara lui 312? → 231 ✓.

Greșeli frecvente

  1. ∅ se numără printre submulțimi: totalul e 2^n, nu 2^n - 1.
  2. Corespondența soluție ↔ index: a k-a soluție are reprezentarea k-1 (numărarea începe de la 0).
  3. La permutări, următoarea lexicografică nu e "rotire": compară poziție cu poziție.
EXEMPLU, ÎN 4 LIMBAJE

Alege limbajul în care dai examenul. Poți edita codul și îl poți rula direct aici. Programa oficiala de BAC (proba E.d) cere Pascal sau C/C++, la alegere. Python apare in manualele noi si e pus aici pentru inteles, nu ca limbaj de examen.

#include <iostream>
using namespace std;

int n = 3, st[10];

void back(int k) {
    if (k > n) {
        cout << "{";
        for (int i = 1; i <= n; i++)
            if (st[i]) cout << i;
        cout << "} ";
        return;
    }
    for (int v = 0; v <= 1; v++) {
        st[k] = v;
        back(k + 1);
    }
}

int main() {
    back(1);
    return 0;
}