import java.util.Arrays;
import java.util.Comparator;

public class KnapsackFraksional {

    record Barang(String nama, int nilai, int berat) { }

    public static void main(String[] args) {
        Barang[] barang = {
            new Barang("Beras premium", 60, 10),
            new Barang("Gula pasir", 100, 20),
            new Barang("Kopi instan", 120, 30),
        };
        int kapasitas = 50;

        // Greedy: urutkan berdasarkan rasio nilai/berat menurun.
        Barang[] urut = barang.clone();
        Arrays.sort(urut, Comparator
                .comparingDouble((Barang b) -> (double) b.nilai() / b.berat())
                .reversed());

        System.out.println("Kapasitas tas: " + kapasitas + " kg");
        System.out.println();
        double totalNilai = 0;
        int sisa = kapasitas;
        for (Barang b : urut) {
            if (sisa <= 0) {
                break;
            }
            int ambil = Math.min(b.berat(), sisa);
            double fraksi = (double) ambil / b.berat();
            totalNilai += b.nilai() * fraksi;
            System.out.printf("Ambil %-14s: %2d/%2d kg (rasio nilai/berat %.1f)%n",
                    b.nama(), ambil, b.berat(), (double) b.nilai() / b.berat());
            sisa -= ambil;
        }
        System.out.println();
        System.out.printf("Total nilai maksimum: %.0f%n", totalNilai);
    }
}
