Diferente pentru metoda-greedy-si-problema-fractionara-a-rucsacului intre reviziile #5 si #6

Nu exista diferente intre titluri.

Diferente intre continut:

}
==
h1. Problema fractionara a rucsacului
 
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.
 
h2. Date de intrare
 
Pe prima linie a fisierului de intrare _rucsac.in_ se gasesc doua numere, primul fiind N, iar al doilea M (cu specificatiile din enunt). Pe urmatoarele N linii se gasesc, despartite printr-un spatiu greutatea obiectului curent si valoarea acestuia.
 
h2. Date de iesire
 
In fisierul de iesire _rucsac.out_ vor fi specificate numarul de ordine al obiectului, precum si procentul in care acesta poate fi introdus in rucsac.
 
h2. Exemplu
 
|_. rucsac.in | |_. rucsac.out |
| 5 100
1000 120
500 20
400 200
1000 100
25 1|          | 2 100
                 4 79
                 5 100 |
 
h2. Descrierea solutiei
 
Vom reprezenta solutia problemei ca pe un vector x. Vom ordona obictele descrescator tinand cont de valoarea/greutate. Atata timp cat obiectele incap in rucsac, le vom adauga in intregime. Completam rucsacul cu un fragment din urmatorul obiect ce nu a fost deja selectat.
 
O implementare simpla a acestui algoritm este urmatoarea:
 
 
==code(cpp) |
 
#include <iostream>
#include <fstream>
using namespace std;
 
ifstream f("rucsac.in");
ofstream g("rucsac.out");
 
int o[100],N,M;
float val[100],greu[100],x[100],Gr;
 
void  citeste()
{
	int i;
	f>>N>>M;
	for (i=0;i<N;++i)
	{
		o[i]=i;
		f>>val[i]>>greu[i];
	}
	f.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]) g<<i+1<<" "<<x[i]*100<<endl;
	g.close();
}
 
int main()
{
	citeste();
	sort();
	rezolva();
	afisare();
	return 0;
}
 
==
 
 

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.