#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