Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Combinari, combinari cu repetitie
Scopul lucrarii. Insusirea notiunile teoretice si practice legate de modul in care se abordeaza problemele care pot fi solutionate folosind:
combinarile de n elemente luate cite m,
sau combinarile cu repetitie de n elemente luate cite m.
Notiuni teoretice
2.1. Generarea combinarilor
Daca A este o multime cu n elemente, atunci submultimile lui A avind fiecare cite m elemente, unde 0 £ m £ n se numesc combinari de n elemente luate cite m.
Fie A, o multime cu n elemente si m < n. Ne intereseaza generarea tuturor celor Cnm submultimi ale multimii A, care contin m elemente. O asemenea submultime se numeste m-combinare.
Pentru reprezentarea submultimii se va folosi reprezentarea printr-un vector cu n componente, fiecare continind un element al multimii. Deoarece in cadrul submultimii ordinea elementelor nu prezinta importanta, in vectorul v se vor genera toti cei Cnm vectorii de forma v=(v1, v2, , vm), ce satisfac relatiile: 1 £ v1 < v2 < .. < vm £ n.
2.1.a. Algoritmul iterativ.
Generarea acestor vectori se face iterativ in ordine lexicografica. Astfel se pleaca de la vectorul v=(1, 2, , m) si se ajunge in final la vectorul (n-m+1, , n-1, n). Pentru a determina succesorul in ordine lexicografica a unui vector v=(v1, v2, , vm) se procedeaza astfel:
a) se determina cel mai mare indice i care indeplineste conditia
vi<n-m+i, vi+1=n-m+i+1, , vm-1=n-1, vm=n;
b) se genereaza drept succesor urmatorul vector
(v1, v2, , vi-1, vi+1, , vi+m-i+1).
Daca nu a fost gasit un indice i care sa respecte conditia de la a), inseamna ca vectorul v contine in ordine elementele n-m+1, n-m+2, , n-1, n, deci au fost generate toate cele Cnm elemente.
In aceste conditii procedurile de initializare si generare sunt:
procedura INIT(v, n, m, ig) este
┌ pentru i=1, m, 1 repeta
│ vi <- i
└
ig <- 1
sfarsit
procedura GEN(v, m, n, ig) este
gasit <- 0
i <- m
┌ cat_timp (i>0) si (gasit=0) repeta
│ ┌ daca vi<n-m+i atunci
│ │ vi <- vi+1
│ │ ┌ pentru j=i+1, m, 1 repeta
│ │ │ vj <- vj-1+1
│ │ └
│ │ gasit <- 1
│ │altfel
│ │ i <- i-1
│ └
└
┌ daca gasit=0 atunci
│ ig <- 0
└
sfarsit
Pentru a evita cele 2 conditii (i>0) si (gasit=0) din procedura GEN, se poate folosi o variabila santinela pe pozitia 0 a vectorului v si care are valoarea diferita de n-m. In acest caz procedurile INIT si GEN au forma de mai jos:
procedura INIT (n, m, v, ig) este
┌ pentru i=1, m, 1 repeta
│ v(i) <- i
└
v0 <- n-m-1
ig <- 1
sfarsit
procedura GEN (n, m, v, ig) este
i <- m
┌ cat_timp vi = n-m+i repeta
│ i <- i-1
└
┌ daca i = 0 atunci
│ ig <- 0
│ altfel
│ vi <- vi+1
│ ┌ pentru j=i+1, m, 1 repeta
│ │ vj <- vj-1+1
│ └
└
sfarsit
Fiecare cavaler este identificat printr-un numar intre 1 si n (pozitia lor la masa). Dusmanii unui cavaler se pot determina cu ajutorul unei functii:
Algoritmul se bazeaza pe generarea tuturor multimilor de m elemente din multimea . Procedura de prelucrare este:
procedura PREL(v, n, m) este
gasit <- 0
i <- 1
┌ cat_timp (i£m) si (gasit=o) repeta
│ j <- i+1
│ ┌ cat_timp j£m si gasit=0 repeta
│ │ ┌ daca abs( vi- vj)=1 sau abs(vi- vj)=n-1 atunci
│ │ │ gasit <- 1
│ │ └
│ │ j <- j+1
│ └
│ i <- i+1
└
┌ pentru i=1, m, 1 repeta
│ scrie vi
└
┌ daca vi=n atunci
│ scrie 'Este solutie'
│ altfel
│ scrie 'Nu este solutie'
└
sfarsit
Programul principal in pseudocod va arata astfel:
scrie 'Introduceti numarul de cavaleri'
citeste n
scrie 'Introduceti dimensiunea grupului'
citeste m
executa INIT(n, m, v, ig)
┌ cat_timp ig¹0 repeta
│ executa PREL(v, n, m)
│ executa GEN(n, m, v, ig)
sfarsit
Pentru cazul particular, cind numarul de cavaleri este 6 iar dimensiunea grupului este 3 rezultatele vor fi afisate astfel:
Introduceti numarul de cavaleri: 6
Introduceti dimensiunea grupului: 3
Nu este solutie
Nu este solutie
Nu este solutie
Nu este solutie
Este solutie
Nu este solutie
Nu este solutie
Programul scris in Pascal se afla in Anexa A.L11.1 si C in Anexa B.L11.1.
2.1.b. Algoritmul recursiv.
Pentru generarea recursiva a elementelor vectorului v ce reprezinta se foloseste procedura:
procedura combr(p) este:
daca p=k+1 atunci
PREL();
altfel
daca p=1 atunci
pentru i=1,n,1 repeta
v[p]=i;
combr(p+1)
altfel
│ pentru i=v[p-1]+1,n,1 repeta
v[p]=i;
combr(p+1);
└
Programul scris in Pascal se afla in Anexa A.L11.2 si C in Anexa B.L11.2.
2. 2. Generarea combinarilor cu repetitie
Se numeste m-combinare cu repetitie a n elemente, un vector v cu elemente din multimea care are m elemente ce satisfac conditia:
v1 £ v2 £ £ vm.
Daca inegalitatea dintre elementele vectorului este stricta se regaseste definitia combinarilor uzuale. Pentru generarea combinarilor cu repetitie se va folosi reprezentarea a) (printr-un vector v cu n componente).
2.2.a. Algoritmul iterativ.
Pentru generarea elementelor combinarilor cu repetitie in ordine lexicografica, metoda folosita presupune parcurgerea urmatorilor pas:
a) se initiaza elementele vectorului v la valoarea 1, adica vi=1, pentru 1 £ i £ m;
b) pentru a se determina succesorul unui vector oarecare v=(v1, v2, vm) se determina cel mai mare indice i pentru care vi < n (daca un asemenea indice nu exista inseamna ca generarea s-a terminat ), iar succesorul vectorului, v', se obtine din v, inscriind pe pozitiile vi, vi+1, , vm, valoarea vi+1, adica v'=(v1, v2, , vi+1, vi+1, , vi+1);
c) procesul de generare se incheie in momentul in care s-a ajuns la generarea vectorului v=(n, n, , n).
Procedurile de initializare si generare sunt:
procedura INIT(v, n, m, ig) este
┌ pentru i=1, m, 1 repeta
│ vi <- 1
└
ig <- 1
sfarsit
procedura GEN(v, n, m, ig) este
i <- m
gasit <- 0
┌ cat_timp (i>0) si (gasit=0) repeta
│ ┌ daca vi < n atunci
│ │ gasit <- 1
│ │ x <- vi + 1
│ │ ┌ pentru j=i, m, 1 repeta
│ │ │ vj <- x
│ │ └
│ │altfel
│ │ i <- i - 1
│ └
└
┌ daca gasit=0 atunci
│ ig <- 0
└
sfarsit
De exemplu, daca n=5 si m=3, elementele generate sunt: (1, 1, 1), (1, 1, 2), , (1, 1, 5), (1, 2, 2), , (1, 2, 5), , (5, 5, 5).
Daca se doreste folosirea unei variante cu santinela, aceasta trebuie asezata pe pozitia 0 a vectorului v si sa aiba valoarea diferita de n. In acest caz procedurile INIT si GEN au forma:
procedura INIT(n, m, v, ig) este
┌ pentru i=1, m, 1 repeta
│ vi <- 1
└
v0 <- n-1
ig <- 1
sfarsit
procedura GEN (n, m, v, ig) este
i <- m
┌ cat_timp vi = n repeta
│ i <- i-1
└
┌ daca i=0 atunci
│ ig <- 0
│ altfel
│ x <- vi + n
│ ┌ pentru j=i, m, 1 repeta
│ │ vj <- x
│ └
└
sfarsit
Exemplu rezolvat. Sa consideram ca o cofetarie dispune de n tipuri de prajituri. Costul acestor prajituri este costi, cu 1 £ i £ n. Care sunt posibilitatile de cumparare a m prajituri astlel ca ele sa nu coste mai mult decit 'suma' lei?
O solutie a problemei se poate reprezenta sub forma unui vector v=(v1, v2, , vm), unde vi reprezinta tipul prajiturii i. Deoarece nu conteaza ordinea de cumparare a prajiturilor si prajiturile nu sunt neaparat distincte rezulta ca trebuie determinate toate solutiile de forma 1 £ v1 £ v2 £ £ vm £ n
Deci trebuie generate toate combinarile cu repetitie cu m elemente din n. Pentru fiecare element generat se selecteaza acela pentru care pretul este mai mic sau egal decit 'suma'. Procedura de prelucrare este:
procedura PREL(v, n, m, suma, cost) este
s <- 0
┌ pentru i=1, n, 1 repeta
│ s <- s+cost[vi]
└
┌ pentru i=1, n, 1 repeta
│ scrie vi
└
┌ daca s £ suma atunci
│ scrie 'Este solutie'
│altfel
│ scrie 'Nu este solutie'
└
sfarsit
Programul principal in pseudocod va arata astfel:
scrie 'Introduceti numarul total de prajituri'
citeste n
scrie 'Introduceti costul prajiturilor'
┌ pentru i=1, n, 1 repeta
│ scrie 'Prajitura ', i, 'costa'
│ citeste costi
scrie 'Introduceti nunarul de prajituri de cumparat:'
citeste m
scrie 'Introduceti suma:'
citeste suma
executa INIT(n, m, v, ig)
┌ cat_timp ig¹0 repeta
│ executa PREL(v, n, m, suma, cost)
│ executa GEN(n, m, v, ig)
sfarsit
Pentru cazul particular, cind numarul total de prajituri existent este 4, costul prajiturilor este 5, 9, 8, respectiv 4 lei, numarul de prajituri de cumparat este 5 si se dispune de 30 lei rezultatele se vor asfisa astfel:
Introduceti numarul total de prajituri: 4
Introduceti costul prajiturilor
Prajitura 1 costa: 5
Prajitura 2 costa: 9
Prajitura 3 costa: 8
Prajitura 4 costa: 4
Introduceti nunarul de prajuturi de cumparat: 5
Introduceti suma: 30
1 1 1 1 1 Este solutie
1 1 1 1 2 Este solutie
1 1 1 1 3 Este solutie
1 1 1 1 4 Este solutie
1 1 1 2 2 Nu este solutie
Este solutie
2.2.b. Algoritmul recursiv.
procedura GEN_COMB_REP( i) este
pentru j=1,m,1 repeta
v[i]=j
daca i<n atunci
executa GEN_COMB_REP(i+1);
altfel
ok=1;
pentru k=1,n,1 repeta
daca v[k]>v[k+1] atunci ok=0;
daca ok=1 atunci
executa PREL()
sfarsit
3. Probleme propuse
1. Se considera un grup de n cadre didactice, din care se aleg comisii de examinare formate fiecare din m membrii. Pentru fiecare cadru se cunoaste gradul didactic (profesor, conferentiar, lector, asistent) si un cod de identificare. Sa se determine toate comisiile posibile in care cel putin un cadru este profesor (n si m, precum si codul si gradul fiecarei persoane se introduc de utilizator).
2. Se da un grup de n specialisti in comunicatii telefonice, din care se aleg echipe de interventii formate fiecare din m membrii. Pentru fiecare specialist se cunoaste calificarea (inginer, subinginer, tehnician, muncitor) si un cod de identificare. Sa se determine toate echipele posibile in care cel putin un specialist este inginer (n si m, precum si codul si gradul fiecarei persoane se introduc de utilizator).
3. Fie G un grup de n politisti, din care se aleg patrule formate fiecare din m membrii. Pentru fiecare se cunoaste gradul (locotenent, plutonier, sergent, soldat) si un cod de identificare. Sa se determine toate patrulele posibile in care cel putin un politist este locotenent (n si m, precum si codul si gradul fiecarei persoane se introduc de utilizator).
4. Se considera un grup de n ziaristi, din care se aleg echipe de reportaj formate fiecare din m membrii. Pentru fiecare ziarist se cunoaste specializarea (editorial, interviu, fotoreportaj, ancheta) si un cod de identificare. Sa se determine toate echipele posibile in care cel putin un ziarist este editorialist (n si m, precum si codul si gradul fiecarei persoane se introduc de utilizator).
5. Fie G un grup de n contabili, din care se aleg echipe de revizie formate fiecare din m membrii. Pentru fiecare contabil se cunoaste calificarea (universitate, institut, scoala medie, liceu) si un cod de identificare. Sa se determine toate echipele posibile in care cel putin un contabil are studii superioare (n si m, precum si codul si gradul fiecarei persoane se introduc de utilizator).
6 Se da un grup de n exploratori, din care se aleg echipe formate fiecare din m membrii. Pentru fiecare explorator se cunoaste specializarea (biologie, etnologie, ecologie, geologie) si un cod de identificare. Sa se determine toate echipele posibile in care cel putin un explorator este ecolog (n si m, precum si codul si gradul fiecarei persoane se introduc de utilizator).
7 Se considera un grup de n sportivi, avind diferite inaltimi, unii dintre ei au inaltimi identice. Numarul n, precum si inaltimea si un cod de identificare pentru fiecare se introduc de utilizator. Sa se listeze toate posibilitatile de a-i aseza intr- o coloana, unul in spatele altuia, in ordinea descrescatoare a inaltimii.
8 Fie G un grup de n boxeri, avind diferite greutati, unii dintre ei au greutati identice. Numarul n, precum si greutatea si un cod de identificare pentru fiecare se introduc de utilizator. Sa se listeze toate posibilitatile de a-i introduce in controlul antidoping, unul dupa altul, in ordinea descrescatoare a greutati.
9 Se considera un grup de n copii, avind diferite virste, unii dintre ei au virste identice. Numarul n, precum si virsta si un cod de identificare pentru fiecare se introduc de utilizator. Sa se listeze toate posibilitatile de a-i introduce la vaccinare, unul dupa altul, in ordinea descrescatoare ( crescatoare ) a virstei.
10 Fie G un grup de n automobile, avind diferite capacitati, unele dintre ele au capacitati identice. Numarul n, precum si capacitatea si un cod de identificare pentru fiecare se introduc de utilizator. Sa se listeze toate posibilitatile de a le introduce la startul unui raliu, unul dupa altul, in ordinea crescatoare a capacitatii cilindrice.
11 Se da un grup de n camioane, avind diferite tonaje, unele dintre ele au tonaje identice. Numarul n, precum si tonajul si un cod de identificare pentru fiecare se introduc de utilizator. Sa se listeze toate posibilitatile de a le introduce la o rampa de incarcare, unul dupa altul, in ordinea crescatoare a tonajului.
12. Se considera un tort pe care se pot pune bomboane. Bomboanele au n culori. Sa se afiseze toate posibilitatile de a aseza m bomboane identice sau diferite pe coliva, astfel incit sa fie cel putin o bomboana din fiecare fel (m si n se introduc de utilizator astfel incat m>n).
13. Se da o matrice n x n cu elemente numere naturale, se cere sa se determine sumele de m valori de pe linii si coloane diferite care sunt mai mici decat o suma data.
Se considera o secventa de n numere naturale distincte.
a.Se cere sa se scrie un program de generare a m‑combinarilor cu repetitie a celor n numere.
b.sa se scrie un program de generare a m-combinarilor celor n numere.
15.Avind la dispozitie n (n>0) obiecte distincte si k cutii, sa se distribuie in prima cutie n1 obiecte, in a doua n2 obiecte, s.a.m.d. (n1+n2++nk=n). Care sint posibilitatile de distribuire?
16. Cei m absolventi ai unei facultati trebuie sa urmeze niste cursuri de specializare. Se stie ca exista n directii de specializare. Sa se genereze toate posibilitatile de repartizare pe specializari ale absolventilor facultatii.
17. Aparatele de perforat plasate pe mijloacele de transport in comun folosesc 9 puncte de perforare situare in virfurile, mijloacele laturilor si centrul unui dreptunghi ABCD. Sa se genereze toate modalitatile in care poate fi perforat un bilet pentru toate combinatiile posibile ale punctelor de perforare, stiind ca biletul poate fi introdus in aparat cu latura AB in jos, pe oricare dintre cele doua fete.
18. Se considera o bara de lungime n si m repere de lungimi k(1),k(2),,k(m). Din bara trebuiesc taiate bucati de lungimea reperelor date astfel incit sa rezulte din fiecare reper cel putin o bucata, iar pierderile sa fie minime.
18. La admiterea in invatamintul superior este necesar sa se sustina n examene. Un candidat potential, ce stie ca poate reusi daca acumuleaza cel putin m puncte, isi determina posibilitatile de reusita. Care sint acestea?
19. Intr‑o intreprindere exista disponibile m cadre. Pentru realizarea unui anumit proiect, cele m cadre trebuie sa urmeze o perioada de specializare. Stiind ca pentru realizarea proiectului trebuie sa existe specialisti in n domenii, sa se genereze toate posibilitatile in care cadrele pot fi repartizate pe specializari, astfel incit proiectul sa se poata realiza dupa perioada de specializare( un cadru poate sa urmeze o singura specializare si toate cele m cadre trebuie specializate, m>=n ).
ANEXE
B.L11.1 COMB
#include <stdio.h>
#include <conio.h>
int v[20],n,m,ig;
void INIT(int m, int n)
void PREL()
i++;
for(i=1;i<=m;i++)
printf('%d ',v[i]);
if(gasit) printf('Nu este solutien');
else printf('Este solutien');
getch();
void GEN()
void main()
B.L11.2 COMB REC
La masa rotunda a regelui Arthur sunt asezati n cavaleri. Fiecare cavaler este dusman cu vecinii lui. Merlin trebuie sa aleaga m cavaleri care sa o salveze pe printesa r_pita. Care sunt posibilitatile de alegere a echipei, astfel incit in echipa formata sa nu existe dusmani? (varianta recursiva)
#include <stdio.h>
#include <conio.h>
#define MAX 25
int n,v[MAX],k;
void PREL()
i++;
if(gasit)
printf(' Nu este solutien');
else
printf(' Este solutien');
getch();
void comb(int p)
else
for(i=v[p-1]+1;i<=n;i++)
void main()
B.L11. 7 Comb cu rep
#include<stdio.h>
#include <conio.h>
#define DIM 25
int m,n,v[DIM],ig;
int cost[DIM],suma;
void INIT()
void GEN()
void PREL()
void main()
printf('Introduceti numarul de prajituri de cumparat:');scanf('%d',&m);
printf('Introduceti suma:');scanf('%d',&suma);
INIT(n,m);
while(ig)
comb cu rep rec
#include <stdio.h>
# include <conio.h>
#define DIM 25
int ig,v[DIM],n,m;
int cost[DIM],suma;
void PREL()
void GEN(int i)
void main()
printf('Introduceti numarul de prajituri de cumparat:'); scanf('%d',&n);
printf('Introduceti suma:'); scanf('%d',&suma);
GEN(1);
Copyright © 2024 - Toate drepturile rezervate