Metoda GREEDY


METODA GREEDY



Este o metodă de optimizare . Se pleacă de la o problemă : Se dau un sac de capacitate C si n obiecte de capacități și prețuri diferite c1,...,cn și p1.....pn .
Fiecare obiect are prețul pi și capacitatea ci .
Se cere să se umple sacul cu o valoare cât mai mare .
Logic se vor ordona întâi descrescător rapoartele pi/ci. (sau crescător inversele acestor fracții , adică ci/pi ).
Se adună capacitățiile obiectelor  la o sumă care în final nu depășește C – capacitatea sacului .
E firesc că în sac se prea poate să nu intre toate obiectele .
Important e ca valoarea totală a acestora să fie cât mai mare.
ci<=C

#include<conio.h>
#include<stdio.h>
#include<iostream.h>
#pragma hdrstop;
//C-capacitate rucsac c1..cn-capacitati obiecte p1..pn-preturi obiecte
//se sorteaza pi/ci prin bubllesort descrescator
//suma capacitatilor dupa sortare<C
int C,c[10],n,p[10],x,i,y,j,s=0;//s-suma capacit obiectelor
void sortare()
{
j=0;//variabila semafor
do
{
j=0;
for(i=0;i<=n-2;i++){ if(p[i]/c[i]<p[i+1]/c[i+1]) { j=1;
                                                                                                   x=c[i];
                                                                                                   c[i]=c[i+1];
                                                                                                   c[i+1]=x;
                                                                                                   y=p[i];
                                                                                                   p[i]=p[i+1];
                                                                                                   p[i+1]=y;
                                   }                                                              }
 }while(j==1);
 }//sortare

 int main()
 {clrscr();
  cout<<"dati capacit rucsac C ";cin>>C;
  cout<<"dati nr de obiecte n ";cin>>n;
 for(i=0;i<=n-1;i++){ cout<<"c["<<i<<"]=";cin>>c[i];
                                      cout<<"p["<<i<<"]=";cin>>p[i];
                                      }
 sortare();
 cout<<"pret/capacitate"<<endl;
 for(j=0;j<=n-1;j++) if(s+c[j]<=C) { s=s+c[j]  ;
                                                                     cout<<"obiect " <<c[j]<<"  "<<p[j]<<endl;
                                                                    }
                                                                     else break;



  cout<<"se introduc in sac "<<j;
  cout<<"  obiecte cu valoare pe unitatea de capacitate- maxima ";
  getch();
return 0;
  }

Pt CodeBlocks se recomandă
·         să nu folosim clrscr , getch și nici bibliotecile conio si stdio !
·         să scriem uses namespace std
·         să scriem iostream fară .h
·         compilator Mngw