#include <stdio.h>
#include <stdlib.h>
// Item struct
typedef struct { int v, w; float r; } Item;
// Compare function for qsort (descending ratio)
int compare(const void *a, const void *b) {
float rA = ((Item *)a)->r;
float rB = ((Item *)b)->r;
if (rA < rB) return 1;
if (rA > rB) return -1;
return 0;
}
// Greedy Rational Knapsack solution
float knapsack(float capacity, Item items[], int n) {
float totalValue = 0.0;
int i;
for (i = 0; i < n; i++) {
items[i].r = (float)items[i].v / items[i].w;
}
qsort(items
, n
, sizeof(Item
), compare
);
for (i = 0; i < n; i++) {
if (capacity <= 0) break;
if (items[i].w <= capacity) {
totalValue += items[i].v;
capacity -= items[i].w;
} else {
totalValue += items[i].v * (capacity / items[i].w);
capacity = 0;
}
}
return totalValue;
}
// Main function for testing
int main() {
float W = 50.0;
Item goods[] = {{60, 10, 0}, {100, 20, 0}, {120, 30, 0}};
int N = 3;
float result = knapsack(W, goods, N);
printf("Nilai Optimal Knapsack (W=%.0f): %.2f\n", W
, result
); // Output: 240.00 return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCi8vIEl0ZW0gc3RydWN0CnR5cGVkZWYgc3RydWN0IHsgaW50IHYsIHc7IGZsb2F0IHI7IH0gSXRlbTsKCi8vIENvbXBhcmUgZnVuY3Rpb24gZm9yIHFzb3J0IChkZXNjZW5kaW5nIHJhdGlvKQppbnQgY29tcGFyZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7CiAgICBmbG9hdCByQSA9ICgoSXRlbSAqKWEpLT5yOwogICAgZmxvYXQgckIgPSAoKEl0ZW0gKiliKS0+cjsKICAgIGlmIChyQSA8IHJCKSByZXR1cm4gMTsKICAgIGlmIChyQSA+IHJCKSByZXR1cm4gLTE7CiAgICByZXR1cm4gMDsKfQoKLy8gR3JlZWR5IFJhdGlvbmFsIEtuYXBzYWNrIHNvbHV0aW9uCmZsb2F0IGtuYXBzYWNrKGZsb2F0IGNhcGFjaXR5LCBJdGVtIGl0ZW1zW10sIGludCBuKSB7CiAgICBmbG9hdCB0b3RhbFZhbHVlID0gMC4wOwogICAgaW50IGk7CgogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGl0ZW1zW2ldLnIgPSAoZmxvYXQpaXRlbXNbaV0udiAvIGl0ZW1zW2ldLnc7CiAgICB9CiAgICBxc29ydChpdGVtcywgbiwgc2l6ZW9mKEl0ZW0pLCBjb21wYXJlKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIGJyZWFrOwoKICAgICAgICBpZiAoaXRlbXNbaV0udyA8PSBjYXBhY2l0eSkgewogICAgICAgICAgICB0b3RhbFZhbHVlICs9IGl0ZW1zW2ldLnY7CiAgICAgICAgICAgIGNhcGFjaXR5IC09IGl0ZW1zW2ldLnc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG90YWxWYWx1ZSArPSBpdGVtc1tpXS52ICogKGNhcGFjaXR5IC8gaXRlbXNbaV0udyk7CiAgICAgICAgICAgIGNhcGFjaXR5ID0gMDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdG90YWxWYWx1ZTsKfQoKLy8gTWFpbiBmdW5jdGlvbiBmb3IgdGVzdGluZwppbnQgbWFpbigpIHsKICAgIGZsb2F0IFcgPSA1MC4wOwogICAgSXRlbSBnb29kc1tdID0ge3s2MCwgMTAsIDB9LCB7MTAwLCAyMCwgMH0sIHsxMjAsIDMwLCAwfX07CiAgICBpbnQgTiA9IDM7CgogICAgZmxvYXQgcmVzdWx0ID0ga25hcHNhY2soVywgZ29vZHMsIE4pOwoKICAgIHByaW50ZigiTmlsYWkgT3B0aW1hbCBLbmFwc2FjayAoVz0lLjBmKTogJS4yZlxuIiwgVywgcmVzdWx0KTsgLy8gT3V0cHV0OiAyNDAuMDAKICAgIHJldHVybiAwOwp9