#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
// Struktur untuk menyimpan data barang
struct Item {
    double value, weight;
};
 
// Fungsi pembanding berdasarkan rasio nilai/bobot
bool cmp(Item a, Item b) {
    double r1 = a.value / a.weight;
    double r2 = b.value / b.weight;
    return r1 > r2;
}
 
// Fungsi utama Fractional Knapsack
double fractionalKnapsack(double capacity, vector<Item> items) {
    // Urutkan berdasarkan rasio nilai per bobot
    sort(items.begin(), items.end(), cmp);
 
    double totalValue = 0.0;
 
    for (auto &item : items) {
        if (capacity <= 0) break;
 
        if (item.weight <= capacity) {
            // Ambil seluruh barang
            capacity -= item.weight;
            totalValue += item.value;
        } else {
            // Ambil sebagian
            totalValue += item.value * (capacity / item.weight);
            capacity = 0;
        }
    }
 
    return totalValue;
}
 
int main() {
    cout << "=== Program Fractional (Rational) Knapsack ===\n";
 
    // Pengujian 1
    vector<Item> items1 = { {60, 10}, {100, 20}, {120, 30} };
    double capacity1 = 50;
    cout << "\nUji 1:\n";
    cout << "Kapasitas: " << capacity1 << endl;
    cout << "Nilai maksimum: " << fractionalKnapsack(capacity1, items1) << endl;
 
    // Pengujian 2
    vector<Item> items2 = { {5, 2}, {10, 3}, {15, 5}, {7, 7}, {8, 1} };
    double capacity2 = 10;
    cout << "\nUji 2:\n";
    cout << "Kapasitas: " << capacity2 << endl;
    cout << "Nilai maksimum: " << fractionalKnapsack(capacity2, items2) << endl;
 
    // Pengujian 3
    vector<Item> items3 = { {4, 1}, {8, 2}, {15, 5}, {20, 10} };
    double capacity3 = 8;
    cout << "\nUji 3:\n";
    cout << "Kapasitas: " << capacity3 << endl;
    cout << "Nilai maksimum: " << fractionalKnapsack(capacity3, items3) << endl;
 
    return 0;
}
 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gU3RydWt0dXIgdW50dWsgbWVueWltcGFuIGRhdGEgYmFyYW5nCnN0cnVjdCBJdGVtIHsKICAgIGRvdWJsZSB2YWx1ZSwgd2VpZ2h0Owp9OwoKLy8gRnVuZ3NpIHBlbWJhbmRpbmcgYmVyZGFzYXJrYW4gcmFzaW8gbmlsYWkvYm9ib3QKYm9vbCBjbXAoSXRlbSBhLCBJdGVtIGIpIHsKICAgIGRvdWJsZSByMSA9IGEudmFsdWUgLyBhLndlaWdodDsKICAgIGRvdWJsZSByMiA9IGIudmFsdWUgLyBiLndlaWdodDsKICAgIHJldHVybiByMSA+IHIyOwp9CgovLyBGdW5nc2kgdXRhbWEgRnJhY3Rpb25hbCBLbmFwc2Fjawpkb3VibGUgZnJhY3Rpb25hbEtuYXBzYWNrKGRvdWJsZSBjYXBhY2l0eSwgdmVjdG9yPEl0ZW0+IGl0ZW1zKSB7CiAgICAvLyBVcnV0a2FuIGJlcmRhc2Fya2FuIHJhc2lvIG5pbGFpIHBlciBib2JvdAogICAgc29ydChpdGVtcy5iZWdpbigpLCBpdGVtcy5lbmQoKSwgY21wKTsKCiAgICBkb3VibGUgdG90YWxWYWx1ZSA9IDAuMDsKCiAgICBmb3IgKGF1dG8gJml0ZW0gOiBpdGVtcykgewogICAgICAgIGlmIChjYXBhY2l0eSA8PSAwKSBicmVhazsKCiAgICAgICAgaWYgKGl0ZW0ud2VpZ2h0IDw9IGNhcGFjaXR5KSB7CiAgICAgICAgICAgIC8vIEFtYmlsIHNlbHVydWggYmFyYW5nCiAgICAgICAgICAgIGNhcGFjaXR5IC09IGl0ZW0ud2VpZ2h0OwogICAgICAgICAgICB0b3RhbFZhbHVlICs9IGl0ZW0udmFsdWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gQW1iaWwgc2ViYWdpYW4KICAgICAgICAgICAgdG90YWxWYWx1ZSArPSBpdGVtLnZhbHVlICogKGNhcGFjaXR5IC8gaXRlbS53ZWlnaHQpOwogICAgICAgICAgICBjYXBhY2l0eSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB0b3RhbFZhbHVlOwp9CgppbnQgbWFpbigpIHsKICAgIGNvdXQgPDwgIj09PSBQcm9ncmFtIEZyYWN0aW9uYWwgKFJhdGlvbmFsKSBLbmFwc2FjayA9PT1cbiI7CgogICAgLy8gUGVuZ3VqaWFuIDEKICAgIHZlY3RvcjxJdGVtPiBpdGVtczEgPSB7IHs2MCwgMTB9LCB7MTAwLCAyMH0sIHsxMjAsIDMwfSB9OwogICAgZG91YmxlIGNhcGFjaXR5MSA9IDUwOwogICAgY291dCA8PCAiXG5VamkgMTpcbiI7CiAgICBjb3V0IDw8ICJLYXBhc2l0YXM6ICIgPDwgY2FwYWNpdHkxIDw8IGVuZGw7CiAgICBjb3V0IDw8ICJOaWxhaSBtYWtzaW11bTogIiA8PCBmcmFjdGlvbmFsS25hcHNhY2soY2FwYWNpdHkxLCBpdGVtczEpIDw8IGVuZGw7CgogICAgLy8gUGVuZ3VqaWFuIDIKICAgIHZlY3RvcjxJdGVtPiBpdGVtczIgPSB7IHs1LCAyfSwgezEwLCAzfSwgezE1LCA1fSwgezcsIDd9LCB7OCwgMX0gfTsKICAgIGRvdWJsZSBjYXBhY2l0eTIgPSAxMDsKICAgIGNvdXQgPDwgIlxuVWppIDI6XG4iOwogICAgY291dCA8PCAiS2FwYXNpdGFzOiAiIDw8IGNhcGFjaXR5MiA8PCBlbmRsOwogICAgY291dCA8PCAiTmlsYWkgbWFrc2ltdW06ICIgPDwgZnJhY3Rpb25hbEtuYXBzYWNrKGNhcGFjaXR5MiwgaXRlbXMyKSA8PCBlbmRsOwoKICAgIC8vIFBlbmd1amlhbiAzCiAgICB2ZWN0b3I8SXRlbT4gaXRlbXMzID0geyB7NCwgMX0sIHs4LCAyfSwgezE1LCA1fSwgezIwLCAxMH0gfTsKICAgIGRvdWJsZSBjYXBhY2l0eTMgPSA4OwogICAgY291dCA8PCAiXG5VamkgMzpcbiI7CiAgICBjb3V0IDw8ICJLYXBhc2l0YXM6ICIgPDwgY2FwYWNpdHkzIDw8IGVuZGw7CiAgICBjb3V0IDw8ICJOaWxhaSBtYWtzaW11bTogIiA8PCBmcmFjdGlvbmFsS25hcHNhY2soY2FwYWNpdHkzLCBpdGVtczMpIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0K