Mochila.java 5.85 KB
Newer Older
Cesar Giulano Gonzalez Maqueda 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 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 64 65 66 67 68 69 70 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 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
import java.util.ArrayList;
import java.util.Scanner;

public class Mochila {
    /*
    * Clase que representa un mochila en la cual se podra cargar Objetos
    * Atributos: maxPeso, valorTransportado, pesoOcupado, ObjetosDisponibles y ObjetosCargados
    * Metodos Importantes :
    *       Constructor: Instancia una mochila y le asigna un peso maximo;
    *       cargarMochilaEficientemente: Carga la mochila con los objetos disponibles;
    *       fillMochila: Clase helper de cargarMochilaEficientemente que rellena el ArrayList con los objetos cargados.
    * */
    private int maxPeso;
    private int valorTransportado = 0;
    private int pesoOcupado = 0;
    ArrayList<Objeto> objetosDisponibles;
    ArrayList<Objeto> objetosCargados;

    public Mochila(int maxPeso){
        this.maxPeso = maxPeso;
        this.objetosDisponibles = new ArrayList<Objeto>();
        this.objetosCargados = new ArrayList<Objeto>();
    }

    public float getMaxPeso() {
        return maxPeso;
    }

    public void setMaxPeso(int maxPeso) {
        this.maxPeso = maxPeso;
    }

    public int getValorTransportado() {
        return valorTransportado;
    }

    public void setValorTransportado(int valorTransportado) {
        this.valorTransportado = valorTransportado;
    }

    public int getPesoOcupado() {
        return pesoOcupado;
    }

    public void setPesoOcupado(int pesoOcupado) {
        this.pesoOcupado = pesoOcupado;
    }

    public void cargarMochila(int value, int peso){
        objetosDisponibles.add(new Objeto(value, peso));
    }

    public void imprimirObjDispobibles(){
        for(Objeto obj: objetosDisponibles){
            System.out.print("[val: "+obj.getValue()+", peso: "+obj.getPeso()+"]-");
        }
        System.out.println();
    }

    public void imprimirObjCargados(){
        for(Objeto obj: objetosCargados){
            System.out.print("[val: "+obj.getValue()+", peso: "+obj.getPeso()+"]-");
        }
        System.out.println();
    }

    private void fillMochila(String values){
        for(int i=0;i<values.length();i++){
            objetosCargados.add(objetosDisponibles.get((Character.getNumericValue(values.charAt(i)))));
            pesoOcupado += objetosCargados.get(i).getPeso();
        }
    }

    private static int max(int i, int j)
    {
        return (i > j) ? i : j;
    }


    private void cargarMochilaEficientemente()
    {
        objetosCargados.clear();
        pesoOcupado = 0;
        int[] dp = new int[maxPeso + 1];
        String[] flags = new String[maxPeso + 1];
        for(int i=0;i<maxPeso+1;i++){
            flags[i] = "";
        }

        for(int i = 0; i <= maxPeso; i++){
            String temp2="";
            for(int j = 0; j < objetosDisponibles.size(); j++){
                if(objetosDisponibles.get(j).getPeso() <= i){
                    int temp = dp[i];
                    dp[i] = max(dp[i], dp[i - objetosDisponibles.get(j).getPeso()] +
                            objetosDisponibles.get(j).getValue());
                    if(!(dp[i] == temp)){
                        temp2 = ""+flags[i - objetosDisponibles.get(j).getPeso()]+j;
                    }
                }
            }
            flags[i] = temp2;
        }
        fillMochila(flags[maxPeso]);
        valorTransportado = dp[maxPeso];
    }



    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        System.out.println("Ingrese la capacidad maxima de su mochila en KG: ");
        int capacidad = in.nextInt();
        Mochila mochila = new Mochila(capacidad);
        int choice=0;
        int valor = 0;
        int peso = 0;
        boolean continuar = true;
        do{
            System.out.println("Peso Maximo: "+capacidad+
                    "\nValor Transportado: "+mochila.getValorTransportado()+
                    "\nPeso Ocupado: "+mochila.getPesoOcupado()+
                    "\n-------------------\n1 - Crear Objeto\n2 - Imprimir Objetos Disponibles\n3 - Imprimir Objetos de Mochila\n4 - AutoRellenar Mochila\n5 - Salir\nEntrada: ");
            try{
                choice = in.nextInt();
            }catch (Exception e){
                System.out.println("Entrada no validad");
            }
            switch (choice){
                case 1:
                    System.out.println("Ingrese el valor del objeto: ");
                    valor = in.nextInt();
                    System.out.println("Ingrese el peso del objeto: ");
                    peso = in.nextInt();
                    mochila.cargarMochila(valor, peso);
                    break;
                case 2:
                    mochila.imprimirObjDispobibles();
                    break;
                case 3:
                    mochila.imprimirObjCargados();
                    break;
                case 4:
                    System.out.println("Mochila Cargada!");
                    mochila.cargarMochilaEficientemente();
                    break;
                case 5:
                    System.out.println("Saliendo...");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    continuar = false;
                    break;
                default:
                    System.out.println("Eleccion no validad");
            }
        }while(continuar);
    }
}

class Objeto {
    /*
    * Clase que representa objetos que se pueden cargar en la mochila
    * Atributos: peso y valor
    * */
    private int peso;
    private int value;


    public Objeto(int value, int peso){
        this.value = value;
        this.peso = peso;
    }

    public int getPeso() {
        return peso;
    }

    public void setPeso(int peso) {
        this.peso = peso;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}