Sunteți pe pagina 1din 13

3.

Sirurile lui Gauss


5. Anagrama
7. Comis voiajor
11. Expresie aplicata (Seminar 3)
12. Verificarea egalitatii a 2 siruri
15. Salvarea printesei nu are rezolvare
18. Inmultire optima a unui sir de matrice
20. Cerc de raza minima nu are rezolvare
PROBLEMA Rucsacului
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
int cap,scap;
void main(void)
{
float *cu,*x;
int n,i,j,*v,*g,*c;
int* rucsac (int,int*,int*,float*,float*);
clrscr();
printf("\n CAPACITATEA RUCSACULUI : ");
scanf("%d",&cap);
printf("\n NR. OBIECTELOR PENTRU TRANSPORT : ");
scanf("%d",&n);
v=(int*)malloc(n*sizeof(int));
c=(int*)malloc(n*sizeof(int));
g=(int*)malloc(n*sizeof(int));
x=(float*)malloc(n*sizeof(float));
cu=(float*)malloc(n*sizeof(float));
printf("\n GREUTAEA FIECARUI OBIECT : ");
for(i=0;i<n;i++)
{
printf("\n g[%d]=",i+1);
scanf("%d",g+i);
};
printf("\n COSTURILE DE TRANSPORT ALE OBIECTELOR : ");
for(i=0;i<n;i++)
{
printf("\n c[%d]=",i+1);
scanf("%d",c+i);
};
v=rucsac(n,g,c,cu,x);
printf("\n OBIECTELE SE VOR INCARCA IN RUCSAC IN URMATOARELE PROCENTE : ");
printf("\n\nGREUT. COST.UNIT. (%)");
for(i=0;i<n;i++)
printf("\n %d %6.2f %6.2f ",*(g+(*(v+i))),cu[i],x[i]*10
0);
}
int* rucsac(int n,int *g,int *c,float *cu,float *x)
{
int* sortdesc(int,float*);
int i,*v;
v=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
cu[i]=(float)(c[i])/(float)(g[i]);
v=sortdesc(i,cu);
scap=cap;
for(i=0;i<n;i++)
{
if(g[v[i]]<scap) x[v[i]]=1;
else x[v[i]]=(float)(scap)/(float)(g[v[i]]);
scap-=g[v[i]]*x[v[i]];
}
return(v);
}
int* sortdesc(int n,float* cu)
{
int i,j,*vv;
vv=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++) vv[i]=0;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(cu[i]>cu[j])
vv[j]=vv[j]+1;
else
vv[i]=vv[i]+1;
};
return(vv);
}
//var2
/* Problema rucsac-ului */
#include <stdio.h>
#include <conio.h>
#define NMAX 50
typedef int vector[NMAX];
vector g, x, sol;
int n, m, fmax, gasitsol;
void afisare(vector sol, int n)
{ int i;
for(i=0; i<n; i++)
if(sol[i]==1) printf("%d ",g[i]);
puts("");
}
void BKT(int k, int gcs)
{
int i;
if(k>n)
{ /* S-a gasit o noua solutie */
if(gcs>fmax)
{
for(i=0; i<n; sol[i++]=x[i]);
fmax=gcs;
}
if(gcs>0) gasitsol=1; /* S-a gasit solutie cu adevarat */
}
else {
if(gcs+g[k]<=m) {
x[k]=1; /* Se ia greutatea in rucsac */
BKT(k+1, gcs+g[k]);
}
x[k]=0; /* Se incearca gasirea unei solutii
si fara greutatea respectiva */
BKT(k+1, gcs);
}
}
void main()
{ int i;
printf("n= "); scanf("%d",&n);
puts("Intorduceti valorile greutatilor: ");
for(i=0; i<n; i++)
{
printf("g[%d]= ", i);
scanf("%d",&g[i]);
}
printf("Capacitatea rucsacului= "); scanf("%d",&m);
gasitsol=0;
fmax=0;
BKT(0, 0);
if(gasitsol)
afisare(sol, n);
else
printf("Nu s-a gasit nici o solutie\n");
}
//var3
// GREEDY problema continua a rucsacului
#include<conio.h>
#include<stdio.h>
void main()
{
float c[9],g[9],ef[9];
int n,i,man1,inv=0;
float gv,man,castig=0;
int ordine[9];
clrscr();
printf("\n Greutatea ce poate fi transportata:");scanf("%f",&gv);
printf("\n numarul obiectelor:");scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("\n cost[%d]=",i);scanf("%f",&c[i]);
printf(" greutate[%d]=",i);scanf("%f",&g[i]);
ordine[i]=i;
ef[i]=c[i]/g[i];
}
while(inv==0)
{
inv=0;
for(i=1;i<=n-1;i++)
if(ef[i]<ef[i+1])
{
man=ef[i];ef[i]=ef[i+1];ef[i+1]=man;
man=c[i];c[i]=c[i+1];c[i+1]=man;
man=g[i];g[i]=g[i+1];g[i+1]=man;
inv=1;
man1=ordine[i];ordine[i]=ordine[i+1];ordine[i+1]=man1;
}
}
i=1;
while(gv>0 && i<=n)
{
if(gv>g[i])
{
printf("\nobiectul %d intra in intregime",ordine[i]);
gv-=g[i];
castig+=c[i];
}
else
{
printf("\nobiectul %d intra in proportie de %f",ordine[i],gv/g[i])
;
castig+=c[i]*gv/g[i];
gv=0;
}
i+=1;
}
printf("\n Castigul total este %f",castig);
getch();
}
roy
Iata o solutie:

#include<fstream.h>
#include<conio.h>

const pinf=1000; //pentru plus infinit
int a[20][20],n,m;


void citire_cost()
{fstream f;
int i,j,x,y,c;
f.open("roy.in",ios::in);
if(f)
cout<<"deschiderea a reusit";
else
cout<<"eroare la deschidere!";
cout<<endl;
f>>n>>m;
//initializare matrice
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
a[i][j]=0;
else
a[i][j]=pinf;
for(i=1;i<=m;i++)
{f>>x>>y>>c;
a[x][y]=a[y][x]=c;}
}

void afisare_mat()
{for(int i=1;i<=n;i++)
{for(int j=1;j<=n;j++)
if(a[i][j]==pinf)
cout<<"pinf ";
else
cout<<a[i][j]<<" ";
cout<<endl;}
}

void genarare_matrice_drumuri_optime()
{for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
}

void descompun_drum(int i,int j) //realizeaza descompunerea portiunii de la i la
j prin k
{int g=0,k=1;
while(k<=n&&!g)
{if(i!=k&&j!=k)
if(a[i][j]==a[i][k]+a[k][j])
{descompun_drum(i,k);
descompun_drum(k,j);
g=1;} //g marcheaza daca se poate realiza descompune
rea
k++;
}
if(!g)
cout<<j<<" "; //cand drumul nu mai poate fi descompus afisez extremitatea f
inala

}

void scriu_drum(int nodini,int nodfin) // functia primeste ca parametri cele dou
a noduri pt care se determina optimul
{if(a[nodini][nodfin]<pinf)
{cout<<"lantul de la "<<nodini<<" la "<<nodfin<<" are lungimea "<<a[nodini]
[nodfin];
cout<<endl<<"un drum optim este: "<<endl;
cout<<nodini<<" ";
descompun_drum(nodini,nodfin); // apeleaza functia care afiseaza efectiv l
antul
}
else
cout<<"nu exista drum de la "<<nodini<<" la "<<nodfin;
}


void main()
{clrscr();int x,y;
citire_cost();
cout<<endl<<"matricea ponderilor "<<endl;
afisare_mat();
genarare_matrice_drumuri_optime();
cout<<endl<<"matricea drumurilor optime "<<endl;
afisare_mat();
cout<<endl<<"Se determina drumul minim intre varfurile x si y "<<endl;
cout<<"x=";
cin>>x;
cout<<"y=";
cin>>y;
scriu_drum(x,y);
getch();
}
roy bun
Cod sursa C/C++
#include<stdio.h>
#include<conio.h>
#define pinf 10000 //pentru plus infinit, o valoare mare care nu exista
int a[20][20],n,m;
void citire_cost()
{ FILE *f;
int i,j,x,y,c;
f= fopen("roy_in.txt","rt");
if(f)
printf("deschiderea a reusit");
else
printf("eroare la deschidere!");
printf("\n");
fscanf(f,"%d",&n);
fscanf(f,"%d\n",&m);
//initializare matrice
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
a[i][j]=0;
else
a[i][j]=pinf;
for(i=1;i<=m;i++)
{fscanf(f,"%d %d %d\n",&x,&y,&c);
a[x][y]=a[y][x]=c;}
fclose(f);
}
void afisare_mat()
{for(int i=1;i<=n;i++)
{for(int j=1;j<=n;j++)
if(a[i][j]==pinf)
printf(" - ");
else
printf("%4d ",a[i][j]);
printf("\n"); }
}
void RoyFloyd() // roy floyd
{for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]>a[i][k]+a[k][j])
{ a[i][j]=a[i][k]+a[k][j];
}
}
void descompun_drum(int i,int j) //realizeaza descompunerea portiunii de la
i la j prin k
{int ok=0,k=1;
while(k<=n&&!ok)
{
if(i!=k&&j!=k)
if(a[i][j]==a[i][k]+a[k][j])
{
descompun_drum(i,k);
descompun_drum(k,j);
ok=1;} //g marcheaza daca se poate realiza
descompunerea
k++;
}
if(!ok)
{
printf(" %d ",j); }//cand drumul nu mai poate fi descompus afisez
extremitatea finala
}
void scriu_drum(int nod_initial,int nod_final) // functia primeste ca parametri
cele doua noduri pt care se determina optimul
{if(a[nod_initial][nod_final]<pinf)
{
printf("lantul de la %d la %d are lungimea %d
",nod_initial,nod_final,a[nod_initial][nod_final]);
printf("\n un drum optim este: %d ",nod_initial);
descompun_drum(nod_initial,nod_final); // apeleaza functia care
afiseaza efectiv lantul
}
else
printf("nu exista lant de la %d la %d ",nod_initial,nod_final);
}
void main()
{
int x,y;
citire_cost();
printf("\nmatricea ponderilor \n");
afisare_mat();
RoyFloyd();
printf("\n matricea drumurilor optime \n");
afisare_mat();
printf("\n Se determina drumul minim intre varfurile x si y \n");
printf("x=");
scanf("%d",&x);
printf("y=");
scanf("%d",&y);
scriu_drum(x,y);
_getch();
}
Fisierul Roy_in.txt este de forma
5 5 // numarul de noduri si numarul de muchi
1 2 2 // intre nodul 1 si 2 exista muchia de cost 2
2 3 3 // intre nodul 2 si 3 exista muchia de cost 3
3 4 1
3 5 8
4 1 10
Dijkstra
void citire(int a[30][30], int*n)
{
int i,j;
printf("n="); scanf("%i", n);
for (i = 0; i<*n; i++)
{for(j = i+1; j<*n; j++)
{
printf("a[%d][%d]=", i+1,j+1);
scanf("%i",&a[i][j]); a[j][i]=a[i][j];
}
a[i][j]=0;
}}
void afis_drum(int I, int t[])
{
i(t[i]!=0) afis_drum(t[i],t);
printf(%d", i+1);
}
int main(int argc, char*argv[])
{
int a[30][30];
int s[30], t[30], d[30];
int n, I, j, r, min, poz;
citire(a,&n);
printf("nodul de pornire=");
scanf("%i",&r);
r--;
for (i=0; i<n; i++)
{s[i] =0; t[i]=0;}
s[r] = 1;
for(i=0; i<n; i++)
{d[i]=a[r][i];
if (i!=r) if(d[i]<3000)
t[i]=r;
}
for(i=0; i<n-1; i++)
{ min = 30000;
for(j=0; j<n; j++)
if (s[j] ==0) if ( d[j]< min)
{min = d[j];
poz = j;
}
s[poz] = 1;
for(j=0; j<n; j++)
if (s[j] == 0) if (d[j] < min )
{ min = d[j]; poz = j;
}
s[poz] = 1;
for(j=0; j<n; j++)
if s[j] = = if ( d[j]>d[poz]+a[poz][j] )
d[j] = d[poz] + a[poz][i];
t[j] = poz;
}}
for (i=0; i<n; i++)
if ( r!= i)
{printf ("\ndistanta de la nodul %d la nodul
%i este %d pe drumul: \n", r+1, i+1, d[i]);
afis_drum(I,t);
}
getch();
return 0;
}

Roy-Foyd Fie F un graf neorientat, dat prin matricea costurilor. Se cere
ca pentru fiecare pereche de varfuri (i,j) sa se tipareasca lungimea drumului mi
nim de la i la j.
void citire( int a[30][30], int *n)
{ int i,j;
printf("n="); scanf("&i", n);
for ( i=0; i<*n; i++)
{ for (j=0; j<*n; j++)
if (i!=j)
{
printf("a[%d][%d]=", i+1, j+1);
scanf("%i", &a[i][j]);
}
a[i][j] = 0;}}
void afisare (float a[][30], int m, int n)
{
printf("\n");
for (int j =0; j<n; j++)
printf("3.1f", a[i][j]);}}
int main (int arcv, char *argv[])
{ int a[30][30];
int sol[30];
int n, i, j, k;
citire (a, &n);
for (k=0; k<n; k++)
for (i=0; i<n; i++)
if (a[i][j] > a[i][k] + a[k][j])
a[i][j] = a[i][k] + a[k][j];
afisare(a,n,n);
getch();
return 0;
}
Cuvant in fraza
Sa se un cuvant dat intr-o fraza.
int da(char*pm, char*pp)
{ char *i;
if (strlen (pm==0)) return 1;
else { i =strchr(pp, pm[0]);
if (i==NULL) return 0;
else return da(pm+1, i+1);
}}
void main()
{ char m[10], p[40];
printf("Cuvantul de cautat: ");
gets(m);
printf("\nFraza: ");
gets(p);
if (da(n,p))
printf("Este in fraza");
else printf("Nu este in fraza");
getch();
}
Multime 1,3,4
int apartine( int el, int v[], int n)
{
for (int i=0; i<n; i++)
if (v[i] == el)
return 1;
return 0; }
void afisare( int v[], int n)
{
printf("/n");
for (int i=0; i<n; i++)
printf("%i", v[i]);}
void main ()
{
int m[100], y, z, i=1; j=0;
m[0] = 1;
while (i<1000)
{
y = 2*m[j]+1;
if(!(apartine(y,m,i)))
{ m[i] = y; i++; }
z = 3*m[j]+1;
if (!(apartine(z,m,i)))
{ m[i] = z; i++; }
j++;}
afisare(m,i);}
numarul 4
void patru_it( int n)
{
int k =-1, a[200];
while (n!4)
{
switch (n%10)
{ case 0: a[++k] = 0; n/=10; break;
case 4: a[++k] = 4; n/=10; break;
default: a[++k] = 2; n*-2; break;
}
}
cout<<"\n4";
for(int i=k; i>=0; i--)
switch (a[i])
{
case 0: n*=10; cout<<"->"<<n; break;
case 4: n=n*10+4; cout<<"->"<<n; break;
default: n/=2; cout<<"->"<<n; break;
}

void patru_rec (int n)
{
if (n-4)
{ switch (n%10)
{case 0: patru_rec (n/10); break;
case4: patru_rec (n/10); break;
default: patru_rec (n*2);)
cout<<"->"<<n;}}
void main ()
{
int n;
cout<<endl<<"n= ";
cin>>n;
patru_it(n);
cout<<endl<<"recursiv ";
patru_rec(n);
}
Problema lui Hamming
procedure ConstMult(n,A)
{
integer a, a2, a3, a5, i,j,k,m, A(n);
a=1; a2=2; i=1; a3=3; j=1; a5=5; k=1;
while (a<=n)
if (a2< a3)
if (a2 < a5)
a = a2;
else a = a5;
else if a3<= a5
a = a3;
else a = a5;
if a<= n then
m = m+1;
A(m) = a;
if a2=a then i = i +1;
a2 = 2*A(i);
if a3=a then j = j+1;
a3 = 3*A(j);
if a5 = a then k = k+1;
a5 = 5*A(k);
return;
end;

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