Sunteți pe pagina 1din 5

Problema dinamica: /*Un paianjen a tesut o panza de forma dreptunghiulara formata din n linii orizontale si m linii verticale.

Calculati in cate moduri poate el merge din coltul stanga-sus in coltul dreapta-jos facand un numar minim de pasi. (n+m-2) */

#include<iostream.h> int main() { unsigned long int a[500][500]={0}; system( "color B" ); int i,j,m,n; cout<<"Dati n: "; cin>>n; cout<<"Dati m: "; cin>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(i==1 || j==1) a[i][j]=1; else a[i][j]=a[i-1][j]+a[i][j-1]; cout<<"Pentru n="<<n<<" si m="<<m<<" exista"; cout<<a[n][m]<<" moduri "<<endl; return 0; }

Exemplu: Exemple: pentru n=3 si m=3 exista 6 moduri pentru n=1 si m=5 exista un singur mod

Problema greedy: /*Se considera ca dispunem de un rucsac cu capacitatea M si de N obiecte, definite fiecare prin greutate si valoare, ce trebuie introduce in rucsac. Se cere o modalitate de a umple rucsacul cu obiecte , astfel incat valoarea totala sa fie maxima. Este posibil ca oricate obiecte si bucati din obiecte sa fie introduse. */

#include <iostream> #include <fstream> using namespace std; ifstream fin ("rucsac.in"); int o[100],n,m; float val[100],greu[100],x[100],gr; void citeste() { int i; fin>>n>>m; for (i=0;i<n;++i) { o[i]=i; fin>>val[i]>>greu[i]; } fin.close(); } void sort() { int i,aux,schimb; do { schimb=0;

for (i=0;i<n-1;++i) if (val[o[i]]/greu[o[i]]<val[o[i+1]]/greu[o[i+1]]) { aux=o[i]; o[i]=o[i+1]; o[i+1]=aux; schimb=1; } } while (schimb); } void rezolva() { int i; for (i=0,gr=m;i<n && gr>greu[o[i]];++i) { x[o[i]]=1; gr=greu[o[i]]; } } void afisare() { int i; for (i=0;i<n;++i) if (x[i]) cout<<i+1<<" "<<x[i]*100<<endl; } int main() { system( "color B" ); citeste(); sort(); rezolva(); afisare(); return 0;}

Problema backtracking in plan: /*Aisati toate drumurile posibile pe care poate sa o ia taximetristul pentru a ajunge din poztia intiala in pozitia finala*/ #include<iostream.h> #include<fstream.h> int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; int a[8][8],n,m,ct,x0,y0,xf,yf,k; void cit(){ ifstream f("intersectie.txt"); f>>n>>m>>x0>>y0>>xf>>yf; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) f>>a[i][j]; a[x0][y0]=1; } int in_lab(int x,int y) { if(x>0 && x<=n && y>0 && y<=m) return 1; else return 0; } void tip(){ if (a[xf][yf]!=0){ cout<<"Sol "<<++ct<<endl; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) if (a[i][j]<0) cout<<"| "; else cout<<a[i][j]<<' '; cout<<endl; }

cout<<endl; } } void back(int x,int y,int k){ for(int i=0;i<4;i++){ int x1=x+dx[i]; int y1=y+dy[i]; if(in_lab(x1,y1) && a[x1][y1]==0){ a[x1][y1]=k; if(x1==xf && y1==yf) tip(); else back(x1,y1,k+1); a[x1][y1]=0; } } } int main(){ cit(); back(x0,y0,2); cout<<"ct="<<ct; return 0; }

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