Mochila.java 4.12 KB
Newer Older
Joel Florentin committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
import java.io.Console;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Mochila {
    private int capacidad;
    private List<Objeto> elementos;

    public Mochila(int capacidad) {
        this.capacidad = capacidad;
        this.elementos = new ArrayList<>();
    }

    public void setCapacidad(int capacidad) {
        this.capacidad = capacidad;
    }
    public int getCapacidad() {
        return capacidad;
    }
    public List<Objeto> getElementos() {
        return elementos;
    }
    public void addElemento(Objeto elemento) {
        this.elementos.add(elemento);
    }

    public void maximoBeneficio(Objeto [] cosas){
        Arrays.sort(cosas, (a,b) -> b.getRatio().compareTo(a.getRatio()));
        int libre=capacidad;
        int cantidadLlevarElemento = 0;
Joel Florentin committed
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
        int index_first_mejor = 0;
        int mejor_index =0;
        int mejor_benefico = 0;
        Objeto objeto;
        int beneficio = 0;
        while(index_first_mejor<cosas.length){
            beneficio = 0;
            libre=capacidad;
            for (int i = index_first_mejor; i < cosas.length; i++) {
                objeto = cosas[i];
                if( objeto.getPeso()<= libre){
                    cantidadLlevarElemento = Math.floorDiv(libre, objeto.getPeso());
                    libre -= (cantidadLlevarElemento * objeto.getPeso());
                    if(beneficio==0) index_first_mejor=i;
                    beneficio += (cantidadLlevarElemento * objeto.getValor());
                }
                if(libre==0){
                    break;
                }

            }
            if(beneficio>mejor_benefico){
                mejor_index = index_first_mejor;
                mejor_benefico = beneficio;
            }
            index_first_mejor++;
        }
        beneficio = 0;
        libre = capacidad;
        for (int i = mejor_index; i < cosas.length; i++) {

            objeto = cosas[i];
Joel Florentin committed
64 65
            if( objeto.getPeso()<= libre){
                cantidadLlevarElemento = Math.floorDiv(libre, objeto.getPeso());
Joel Florentin committed
66
                for (int j = 0; j < cantidadLlevarElemento; j++) {
Joel Florentin committed
67 68 69
                    elementos.add(objeto);
                }
                libre -= (cantidadLlevarElemento * objeto.getPeso());
Joel Florentin committed
70
                beneficio += (cantidadLlevarElemento * objeto.getValor());
Joel Florentin committed
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
            }
            if(libre==0){
                break;
            }

        }
    }

    public static void main(String[] args) {
        Console cons = System.console();
        String pesosS = cons.readLine("Introduzca valores separados por coma de los pesos de los elementos\n");
        String valoresS = cons.readLine("Introduzca valores separados por coma de los valores de los elementos\n");
        String [] pesos = pesosS.split(",");
        String [] valores = valoresS.split(",");
        Objeto [] elementos = new Objeto[pesos.length];
        for (int i = 0; i < pesos.length ; i++) {
            elementos[i] = new Objeto(Integer.parseInt(valores[i]), Integer.parseInt(pesos[i]));
        }
        String capS = cons.readLine("Introduzca capacidad de la mochila\n");
        int cap = Integer.parseInt(capS);
        Mochila mochila = new Mochila(cap);
        mochila.maximoBeneficio(elementos);
        System.out.println("Se escogen estos elementos");
        mochila.getElementos().stream().forEach(e -> System.out.println(e));
        
        
        

    }
    
}

class Objeto{
    private int valor;
    private int peso;
    private Float ratio;
    public Objeto(int valor, int peso) {
        this.valor = valor;
        this.peso = peso;
        this.ratio = ((float)this.valor)/this.peso;
    }
    public int getPeso() {
        return peso;
    }
    public int getValor() {
        return valor;
    }
    public void setPeso(int peso) {
        this.peso = peso;
    }
    public void setValor(int valor) {
        this.valor = valor;
    }
    public Float getRatio() {
        return ratio;
    }
    public void setRatio(float ratio) {
        this.ratio = ratio;
    }
    @Override
    public String toString() {
        
        return "{Valor: " + valor + ",Peso: " + peso + ",Ratio:"+ratio+"}" ; 
    }
}