BinaryHeap no problema da mochila

0 respostas
E

Olá, a minha dúvida é como implementar o binary heap no problema da mochila, eu tenho a base do programa, mas preciso que ele funcione com o binary heap, andei perguntando e me disseram que a única coisa que devo mudar é o método insert e o removeTop, mas sinceramente não tenho idéia de como fazer isso, será que alguém pode me ajudar :?:

O código:

import java.util.Scanner;

class Objeto implements Comparable<Objeto> {
	public String nome;
	public float valor, peso;
	public float frac;
	
	Objeto(String desc, float v, float p) { nome = desc; valor = v; peso = p; }
	public int compareTo(Objeto x) {
		float q = valor/peso - x.valor/x.peso;
		if (q > 0) return 1;
		if (q < 0) return -1;
		return 0;
	}
}

class PQueue<T extends Comparable<? super T>> {
	private T [] array;
	private int pSize;
	
	public PQueue(int n) {
		pSize = 0;
		array = (T[]) new Comparable[n+1];
	}
	
	public void insert(T o) {
		array[pSize++] = o;	
	}
	
	public boolean isEmpty() {
		return pSize == 0;
	}
	
	public T removeTop() {
		int m = 0;
		for(int k = 1; k < pSize; k++)
			if (array[m].compareTo(array[k]) == -1) m = k;
		T o = array[m];
		array[m] = array[--pSize];
		return o;
	}
	
}
	
class FracKnap {
	
	public static void fracknap(PQueue<Objeto> p, float K) {
		while (!p.isEmpty()) {
			Objeto o = p.removeTop();
			if (o.peso <= K) {
				o.frac = 1;
				K -= o.peso;
			}
			else {
				o.frac = K/o.peso;
				K = 0;
			}
		}
	}
	
	public static void main(String [] args) {
		Scanner in = null;
		try {
			in = new Scanner(System.in);
			int n = in.nextInt();
			float K = in.nextFloat();
			Objeto [] obj = new Objeto[n];
			PQueue<Objeto> p = new PQueue<Objeto>(n);
			for (int i = 0; i < n; i++) {
				String s = in.next();
				float peso = in.nextFloat();
				float valor = in.nextFloat();
				obj[i] = new Objeto(s, valor, peso);
				p.insert(obj[i]);
			}
			fracknap(p, K);
			for (int i = 0; i < n; i++)
				System.out.println(obj[i].nome + " " + obj[i].frac);
		} finally {
			if (in != null) {
				in.close();
			}
		}
	}
}

Desde já, muito obrigado :wink:

Criado 3 de maio de 2008
Respostas 0
Participantes 1