Informatică, întrebare adresată de andr078, 8 ani în urmă

Va rog mult am nevoie de problema maine si nu stiu!!!!
1.Să se genereze toate partiţiile mulţimii A formate din submulţimi care au acelaşi număr de elemente. Va rog mult ! Imi puteti spune ce ati schimbat la algoritm si de ce ? (as dori o explicatie pas cu pas pentru a intelege)

#include
typedef int stiva[100];
int n,k,ev,as;
stiva st;
void init() {st[k]=0;}
int succesor()
{if (st[k] {st[k]=st[k]+1; return 1;}
else return 0;}
int valid() {return 1;}
int solutie()
{return k==n;}
void tipar()
{int i,j,max=st[1];
for(i=2;i max) max=st[i];
for (i=1;i >n; bt();}

Răspunsuri la întrebare

Răspuns de yangw9005
2

scuze, nu pot intelege programul tau. ce vad sunt multe erori de sintaxa, dar cu cat scrii mai mult, cu atat te vei obisnui sa le eviti cand scrii un cod nou :)

voi presupune ca numarul de elemente ale multimii a sunt sub 20, pentru ca vor fi mult prea multe partitii.

intai, ce este o partitie? o partitie este o spargere a unei multimi in mai multe multimi, intersectia fiecaror doua sa fie goala.

hai sa vedem cum putem sa gasim o partitie. Practic, cand punem un element intr-o multime a partitiei, il coloram cu o culoare unica, adica nu il coloram cu inca o culoare. hai sa zicem ca vrem toate partitiile sa aiba un numar de elemente k. observam ca k trebuie sa fie un divizor al lui n (n este numarul de elemente din A). Vom genera submultimiile astfel:

facem o functie:

void bkt(int cell /* la ce pozitie am ajuns in colorare*/ , int coloring[]/* colorarea*/, int n/* acelasi n de mai sus*/, int k /* la fel*/) {

//intai, daca cell este mai mare ca n, inseamna ca am colorat toate celulele,

//acum le vom pune in vectori sau ceva si afisam pe rand, sau ma rog, faci ce vrei cu ele practic

//daca inca mai sunt celule de colorat..

//parcurgem vectorul si vedem ce culori putem sa ii dam lui cell. putem sa ii dam o culoare lui cell daca numarul de elemente in coloring pana la cell colorate cu aceeasi culoare nu depaste k. sugerez sa faci un fel de frecventa, si dupa in pasul urmator, colorezi cell daca nu pe frecventa unei culori nu avem mai mult de k

//parcurgem culoriile (1--n/k) , cu indexul in i

//punem coloring[cell]=i, si dam bkt(..,coloring,...) cu asta nou.

//ATENTIE! pentru ca limbajul c++/c e cum e el, cand dai mai departe un vector ca parametru intr-o functie, el se va modifica si in acel timp. practic, daca apelezi o functie sa seteze elemntele la 1 dintr-un vector, cand iesi din functie,acele elemente vor ramane 1, deci trebuie sa faci  o copie lui coloring, si dupa sa atribui, de fiecare data cand reapelezi

//terminam parcurgerea

//ne intoarcem

}

Te voi lasa pe tine sa scrii codul. Daca voi avea timp, ma voi uita si pe nelamuririle tale, pe care te voi ruga sa le lasi in comentarii.

Salut.


andr078: am mai postat o data intrebarea , am pus pozele cu algoritmul acesta si exercitiul . Poate intelegi mult mai bine de acolo. intrebarea este formulata astfel Va rog mult , exercitiul nr 3 ( chiar nu stiu sa-l rezolv )de la Generarea tuturor partilor unei multimi. Va rog sa-mi spuneti ce schimbati in algoritm si de ce. Multumesc !
andr078: am cam intampinat o problema la scrierea codurilor , daca te rog imi poti arata / spune cum ar tebui scris la: //acum le vom pune in vectori sau ceva si afisam pe rand, sau ma rog, faci ce vrei cu ele practic
andr078: si la asta ( sunt praf)://punem coloring[cell]=i, si dam bkt(..,coloring,...) cu asta nou.

//ATENTIE! pentru ca limbajul c++/c e cum e el, cand dai mai departe un vector ca parametru intr-o functie, el se va modifica si in acel timp. practic, daca apelezi o functie sa seteze elemntele la 1 dintr-un vector, cand iesi din functie,acele elemente vor ramane 1, deci trebuie sa faci o copie lui coloring, si dupa sa atribui, de fiecare data cand reapelezi
Alte întrebări interesante