Documente Academic
Documente Profesional
Documente Cultură
Probleme propuse:
1. Problema rucsacului, varianta continuă. Să se scrie subprogramul C pentru rezolvarea
problemei rucsacului. Se consideră un mijloc de transport cu o capacitate dată ( C ). Cu
acesta trebuie transportate obiecte dintr-o mulțime A={ ai ∨i=1 ,n }. Fiecare obiect ocupă o
capacitate specifică c i și aduce un câștig specific vi – fiecare obiect luat separat încape în
mijlocul de transport. Se cere să se determine o modalitate de încărcare care să
maximizeze cîștigul obținut la un transport. Obiectele transportate pot fi fractionate. În
acest caz se va utiliza întotdeauna întreaga capacitate de transport.
4. Să se scrie subprogramul C care permite plata unei sume S ∈ N folosind cât mai puține
bancnote din tipurile (valorile) a i , i=1 , n, știind că printre acestea se află și bancnota cu
valoare unitate. Sunt disponibile cantități nelimitate din fiecare tip de bancnotă.
Probleme rezolvate
Cea mai bună soluție se obține dacă se folosește o valoare derivată: câștigul unitar (c i /v i ). La fiecare pas se
ia în considerare următorul element al mulțimii sortate descrescător (alegere). Dacă acesta încape în
mijlocul de transport (verificare), e adăugat la soluție (adăugare) și se diminuează capacitatea de transport
rămasă disponibilă. Dacă nu încape, atunci, dacă problema este continuă, se ia din obiectul curent atât cât
încape (adăugare). Restul obiectelor se resping și algoritmul se termină.
Pentru reprezentarea soluției se poate folosi un vector în care fiecare element are valoarea 1 (obiect
acceptat) sau 0 (obiect respins). În cazul în care se acceptă fracționarea obiectelor, unul singur va fi
fracționat, iar elementul din vectorul soluție corespunzător lui va avea o valoare în intervalul ( 0,1 ) .
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
void main()
{ //exemplu de apel
float CT; //capacitate totala de transport
float c[30]; //capacitati
float v[30]; //venituri
float sol[30], a, castig;
int i, j,n;
printf("Introduceti capacitatea totala a rucsacului:"); scanf("%f", &CT);
printf("Introduceti numarul de obiecte:"); scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("Capacitatea obietului %d: ", i + 1); scanf("%f", &c[i]);
printf("Venitul obietului %d: ", i + 1); scanf("%f", &v[i]);
}
//prelucrare preliminara
//sortarea obiectelor
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
if (v[i] / c[i] < v[j] / c[j]) //castig unitar
{
a = v[i]; v[i] = v[j]; v[j] = a;
a = c[i]; c[i] = c[j]; c[j] = a;
}
//apel functie
//..................
//afisare rezultate
//........................
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
//problema rucsacului, intreaga
// I: capacitate totala (q), nr. obiecte (n), capacitate ocupata (c), castig (v)
// E: solutia x (x[i]= 0-obiectul i nu e incarcat, 1-obiectul i e incarcat)
//...............................
void main()
{ //exemplu de apel
float CT; //capacitate totala de transport
float c[30]; //capacitati
float v[30], a, castig; //venituri
int sol[30];
int i, j,n;
printf("Introduceti capacitatea totala a rucsacului:"); scanf("%f", &CT);
printf("Introduceti numarul de obiecte:"); scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("Capacitatea obietului %d: ", i + 1); scanf("%f", &c[i]);
printf("Venitul obietului %d: ", i + 1); scanf("%f", &v[i]);
}
//prelucrare preliminara
//sortarea obiectelor
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
if (v[i] / c[i] < v[j] / c[j]) //castig unitar
{
a = v[i]; v[i] = v[j]; v[j] = a;
a = c[i]; c[i] = c[j]; c[j] = a;
}
//apel functie
//.....................
//afisare rezultate
//...................
}
3. Problema sumei maxime
Obs: Ce se întâmplă dacă toate elementele din vector sunt negative? Cum se va proceda în acest caz la
rezolvarea problemei?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
//...........
void main()
int n, i, nr;
for(i=0;i<n;i++)
//.......................
}
4. Plata unei sume cu bacnota unitate
Să se scrie subprogramul C care permite plata unei sume S ∈ N folosind cât mai puține
bancnote din tipurile (valorile) a i , i=1 , n, știind că printre acestea se află și bancnota cu
valoare unitate. Sunt disponibile cantități nelimitate din fiecare tip de bancnotă.
Pentru a folosi cât mai puține bancnote, trebuie utilizate bancnote cu valori cât mai mare, ceea ce duce la
sortarea mulțimii date în ordine descrescătoare. Astfel, bancnotele cu valorile cele mai mari vor fi primele
luate în considerare. Soluția poate fi reprezentată ca un vector B= { bi ∈ N∨i=1 , n } , în care fiecare
element b i arată câte bancnote de tipul a i trebuie utilizate.
Pornind de la valoarea inițială S, se acoperă cât se poate de mult cu cel mai mare tip de bancnotă, apoi se
ajustează suma rămasă de plată. Se continuă cu fiecare tip de bancnotă, până când suma rămasă este zero.
Dacă mai rămân tipuri de bancnote neinvestigate, ele rămân nefolosite. Parametrul t este un vector cu
tipurile de bancnote, aranjate în ordinea descrescătoare a valorii nominale.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
//.................................
for (i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(x[i]<x[j])
aux=x[i];x[i]=x[j];x[j]=aux;
}
}
void main()
for(i=0;i<n;i++)
//..........................