Está en la página 1de 4

/*

* Greedy algorithm para el problema de asignación de productos


*/
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define N 5
#define MAX_FLOAT 1E10
int AsignaProducto(int trabajador, float Costo[N][N], int Producto[N]);
bool YaAsignada(int producto,int Producto[N]);
float CalculaCosto(float Costo[N][N], int Producto[N]);
void PedirCostos(float Costo[N][N]);
int main()
{
float Costo[N][N], costoTotal;//Costo[][] es la matriz de costos
int Producto[N]; //Array de asignación de productos
int trabajador=0;
PedirCostos(Costo);//llenar la matriz de costos
//Asignar el mejor producto
for(trabajador=0; trabajador< N; trabajador++)
{
Producto[trabajador] = AsignaProducto (trabajador,Costo,Producto);
}
costoTotal = CalculaCosto(Costo, Producto);
printf("El costo total es: %f\n", costoTotal);
printf("El vector solución es: \n");
for(trabajador=0;trabajador < N;trabajador++)
{
printf("Trabajador[%d]-->Producto[%d]\n",trabajador,Producto[trabajador]);
}
return 0;
}
void PedirCostos(float Costo[N][N])
{
for(int trabajador=0;trabajador<N;trabajador++)
{
for (int producto=0;producto<N;producto++)
{
printf("Escribe el costo del producto %d para el trabajador %d:",producto,trabajador);
scanf("%f",&Costo[trabajador][producto]);
}
}
}
int AsignaProducto(int trabajador, float Costo[N][N], int Productos[N])
{
int producto=0, mejorProducto=0;
float min = MAX_FLOAT; //minimo con el valor máximo
for(producto=0;producto<N;producto++)
{
if(!YaAsignada(producto, Productos))
{
if(Costo[trabajador][producto] < min)
{
min = Costo[trabajador][producto];
mejorProducto = producto;
}
}
}
return mejorProducto;
}
bool YaAsignada(int producto,int Productos[N])
{
for(int trabajador=0;trabajador<N;trabajador++)
{
if(Productos[trabajador] == producto)
{
return true;
}
}
return false;
}
float CalculaCosto(float Costo[N][N], int Productos[N])
{
int producto=0;
float suma=0;
for(int trabajador=0;trabajador<N;trabajador++)
{
producto = Productos[trabajador];
suma = suma + Costo[trabajador][producto];
}
return suma;
}

También podría gustarte