Sunteți pe pagina 1din 9

METODA GREEDY

1. n spectacole sunt identificate prin numarul spectacolului, ora de inceput si ora de

sfarsit. Sa se planifice cat mai multe dintre acestea astfel incat sa se desfasoare cat mai multe pe parcursul unei zile. Exemplu: n=5 1: 12 - 14 2: 7 - 10 3: 7 - 8 4: 11 - 13 5: 10 12 Solutie: spectacolul 3 care incepe la ora 7 si se termina la ora 8 spectacolul 5 care incepe la ora 10 si se termina la 12 spectacolul 1 care incepe la ora 12 si se termina la 14

Rezolvarea se bazeaz pe metoda greedy. Se ordoneaza spectacolele crescator in functie de ora de final. Se selecteaza initial primul spectacol (cel care se termina cel mai devreme). La fiecare pas se selecteaza primul spectacol neselectat,care nu se suprapune cu cele deja selectate (cele care incep dupa ce se termina ultimul spectacol).
#include <iostream> using namespace std; struct spectacol { int nr; float inceput, sfarsit; } v[30]; int n; void citire () { cout<<"Numarul de spectacole: "; cin>>n; for (int i=1; i<=n; i++) { cout<<"Spectacolul "<<i<<": "<<endl; v[i].nr=i; cout<<"ora inceput: "; cin>>v[i].inceput; cout<<"ora sfarsit: "; cin>>v[i].sfarsit; cout<<endl; } }

int detp (int a, int b) { int pa=0, pb=1; while (a<b) { if (v[a].sfarsit>v[b].sfarsit) { spectacol aux=v[a]; v[a]=v[b]; v[b]=aux; pa=1-pa; pb=1-pb; } a+=pa; b-=pb; } } void quicksort (int a, int b) { int p; if (b-a>=1) { p=detp (a, b); quicksort (a, p-1); quicksort (p+1, b); } } void greedy () { int a=v[1].sfarsit; cout<<"specacolul "<<v[1].nr<<" care incepe la "<<v[1].inceput<<" si se termina la "<<v[1].sfarsit<<endl; for (int i=2; i<=n; i++) if (v[i].inceput>=a) { cout<<"specacolul "<<v[i].nr<<" care incepe la "<<v[i].inceput<<" si se termina la "<<v[i].sfarsit<<endl; a=v[i].sfarsit; } } int main () { citire (); quicksort (1, n); greedy (); return 0; }

2. Se considera n tipuri de bancnote. Stiind pentru fiecare tip numarul de

bancnote/monede avut la dispozitie, determinati o solutie de plata a sumei astfel incat numarul de bancnote utilizat sa fie minim. Exemplu: S = 3260 (suma care trebuie platita) n = 5 (tipuri de monede) 1: val=1000, nr=2 2: val=500, nr=1 3: val=100, nr=8 4: val=50, nr=10 5: val=10, nr=4 Solutie: 2*1000 + 1*500 + 7*100 + 1*50 + 1*10 Rezolvarea se bazeaz pe metoda greedy. Se ordoneaza bancnotele descrescator in functie de valoare. Suma este platita atat cat este posibil cu bancnota de primul tip (pana cand nu mai avem bancnote de acest tip disponibile sau suma ramasa de platit are valoarea mai mica decat cea a bancnotei), apoi cu bancnote din al doilea tip si tot asa pana este achitata in totalitate.
#include <iostream> using namespace std; struct bancnota { int valoare, nr, sol; }v[30]; int n, S, s; void citire () { cout<<"Suma care trebuie platita: "; cin>>S; cout<<"Numarul de tipuri de monede: "; cin>>n; cout<<"Valoarea monedei 1: "; cin>>v[1].valoare; cout<<"Numarul de monede de valoare "<<v[1].valoare<<" cin>>v[1].nr; s=v[1].nr*v[1].valoare; for (int i=2; i<=n; i++)

disponibile:

";

{do{cout<<"Valoarea monedei "<<i<<": "; cin>>v[i].valoare;} while (v[i].valoare>=v[i-1].valoare); cout<<"Numarul de monede de valoare "<<v[i].valoare<<" disponibile: "; cin>>v[i].nr; s+=v[i].nr*v[i].valoare; } } void greedy (int S) { int i; for (i=1; i<=n; i++) {v[i].sol=S/v[i].valoare; if (v[i].sol>v[i].nr) v[i].sol=v[i].nr; S-=v[i].sol*v[i].valoare; } if (S) cout<<"Suma nu poate fi platita in acest mod. "; else {for (i=1; i<=n; i++) if(v[i].sol)cout<<v[i].sol<<'*'<<v[i].valoare<<" + "; cout<<"\b\b\ "; } } int main () { citire (); if (s<S) cout<<"Suma care trebuie platita este prea mare."; else greedy (S); return 0; }

3. Se considera un rucsac pentru care capacitatea de inmagazinare este C. n obiecte sunt

indentificate prin numarul obiectului, masa si valoarea sa. Gasiti toate obiectele care vor fi asezate in rucsac astfel incat valoarea acestuia sa fie maxima si sa nu ii fie depasita capacitatea. Obiectele nu pot fi taiate. Exemplu: C = 20 (capacitatea rucsacului) n = 6 (numarul de obiecte) 1: m=5, val=100 2: m=7, val=490 3: m=5, val=1000 4: m=4, val=400 5: m=6, val=360 6: m=1, val=1000 Solutie: obiectul 6 cu masa 1 si valoarea 1000 obiectul 3 cu masa 5 si valoarea 1000 obiectul 4 cu masa 4 si valoarea 400 obiectul 2 cu masa 7 si valoarea 490 Rezolvarea se bazeaz pe metoda greedy. Se calculeaza pentru fiecare obiect in parte valoarea pe kilogram si se ordoneaza descrescator in functie de aceasta. Cat timp este posibil (incap in rucsac), se selecteaza obiectele in intregime. Deoarece obiectele nu se pot taia, exista posibilitatea ca in rucsac sa ramana loc neocupat.
#include <iostream> using namespace std; struct obiect { int nr; float m, val, vkg; } v[30]; float C, val_R; int n; void citire () { cout<<"Capacitatea rucsacului: "; cin>>C; cout<<"Numarul de obiecte: "; cin>>n; for (int i=1; i<=n; i++) {v[i].nr=i; cout<<"masa obiectului "<<i<<": "; cin>>v[i].m; cout<<"valoarea obiectului "<<i<<": "; cin>>v[i].val;

v[i].vkg=v[i].val/v[i].m; } } int detp (int a, int b) { int pa=0, pb=1; obiect aux; while (a<b) {if (v[a].vkg<v[b].vkg) {aux=v[a]; v[a]=v[b]; v[b]=aux; pa=1-pa; pb=1-pb; } a+=pa; b-=pb; } } void quicksort (int a, int b) { int p; if (b-a>=1) {p=detp (a, b); quicksort (a, p-1); quicksort (p+1, b); } } void greedy () { int i=1; while (C && i<=n) {if (v[i].m<=C) {cout<<"obiectul "<<v[i].nr<<" cu masa "<<v[i].m<<" "<<v[i].val<<endl; C-=v[i].m; val_R+=v[i].val; } i++; } } int main () { citire (); quicksort (1, n); cout<<"Rucsacul va contine urmatoarele obiecte: "<<endl; greedy (); cout<<"Valoarea totala a rucsacului este: "<<val_R; return 0;

si

valoarea

4. Se considera un rucsac pentru care capacitatea de inmagazinare este C. n obiecte sunt

indentificate prin numarul obiectului, masa si valoarea sa. Gasiti toate obiectele care vor fi asezate in rucsac astfel incat valoarea acestuia sa fie maxima si sa nu ii fie depasita capacitatea. Obiectele pot fi taiate. Exemplu: C = 20 (capacitatea rucsacului) n = 6 (numarul de obiecte) 1: m=5, val=100 2: m=7, val=490 3: m=5, val=1000 4: m=4, val=400 5: m=6, val=360 6: m=1, val=1000 Solutie: obiectul 6 cu masa 1 si valoarea 1000 obiectul 3 cu masa 5 si valoarea 1000 obiectul 4 cu masa 4 si valoarea 400 obiectul 2 cu masa 7 si valoarea 490 3 kilograme din obiectul 5 cu valoarea 180

Rezolvarea se bazeaz pe metoda greedy. Se calculeaza pentru fiecare obiect in parte valoarea pe kilogram si se ordoneaza descrescator in functie de aceasta. Cat timp este posibil (incap in rucsac), se selecteaza obiectele in intregime. Se completeaza rucsacul cu un fragment din urmatorul obiect ce nu a fost deja selectat.
#include <iostream> using namespace std; struct obiect { int nr; float m, val, vkg; } v[30]; float C, val_R; int n; void citire () { cout<<"Capacitatea rucsacului: "; cin>>C; cout<<"Numarul de obiecte: "; cin>>n; for (int i=1; i<=n; i++)

{v[i].nr=i; cout<<"masa obiectului "<<i<<": "; cin>>v[i].m; cout<<"valoarea obiectului "<<i<<": "; cin>>v[i].val; v[i].vkg=v[i].val/v[i].m; } } int detp (int a, int b) { int pa=0, pb=1; obiect aux; while (a<b) {if (v[a].vkg<v[b].vkg) {aux=v[a]; v[a]=v[b]; v[b]=aux; pa=1-pa; pb=1-pb; } a+=pa; b-=pb; } } void quicksort (int a, int b) { int p; if (b-a>=1) {p=detp (a, b); quicksort (a, p-1); quicksort (p+1, b); } } void greedy () { int i=1; while (C && i<=n) {if (v[i].m<=C) {cout<<"obiectul "<<v[i].nr<<" cu masa "<<v[i].m<<" si valoarea "<<v[i].val<<endl; C-=v[i].m; val_R+=v[i].val; } else {cout<<C<<" kilograme din obiectul "<<v[i].nr<<"cu valoarea "<<v[i].vkg*C<<endl;; val_R+=v[i].vkg*C; C=0; } i++; } } int main ()

{ citire (); quicksort (1, n); cout<<"Rucsacul va contine urmatoarele obiecte: "<<endl; greedy (); cout<<"Valoarea totala a rucsacului este: "<<val_R; return 0; }

S-ar putea să vă placă și