#include <stdio.h>
#include <stdlib.h>
// Struktur dan Pembanding (Inti Greedy)
typedef struct {
int v, w;
double r; // Rasio v/w
} Item;
int cmp(const void *a, const void *b) {
if (((Item *)b)->r > ((Item *)a)->r) return 1;
if (((Item *)b)->r < ((Item *)a)->r) return -1;
return 0;
}
// Fungsi Solusi Knapsack
double knapsack(Item items[], int n, int capacity, int *sisa) {
// 1. Hitung Rasio
for (int i = 0; i < n; i++) items[i].r = (double)items[i].v / items[i].w;
// 2. Urutkan berdasarkan Rasio
qsort(items
, n
, sizeof(Item
), cmp
);
double totalValue = 0.0;
int currentWeight = 0;
// 3. Ambil Item
for (int i = 0; i < n; i++) {
if (currentWeight + items[i].w <= capacity) {
// Ambil Utuh
currentWeight += items[i].w;
totalValue += items[i].v;
} else {
// Ambil Sebagian (Fractional)
int remaining = capacity - currentWeight;
totalValue += items[i].v * ((double)remaining / items[i].w);
currentWeight = capacity; // Kapasitas penuh
break;
}
}
*sisa = capacity - currentWeight;
return totalValue;
}
int main() {
int n = 5;
int values[] = {5, 4, 7, 8, 10};
int weights[] = {10, 5, 7, 12, 8};
int capacity = 20;
Item items[5];
for (int i = 0; i < n; i++) {
items[i].v = values[i];
items[i].w = weights[i];
}
int sisa_kapasitas;
double optimalValue = knapsack(items, n, capacity, &sisa_kapasitas);
// --- Hasil Uji Sesuai Permintaan ---
printf("Nilai Optimal: %.0lf\n", optimalValue
); printf("Sisa Kapasitas: %d\n", sisa_kapasitas
); printf("Keluaran Singkat (Nilai Sisa): **%.0lf %d**\n", optimalValue
, sisa_kapasitas
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCi8vIFN0cnVrdHVyIGRhbiBQZW1iYW5kaW5nIChJbnRpIEdyZWVkeSkKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50IHYsIHc7IAogICAgZG91YmxlIHI7IC8vIFJhc2lvIHYvdwp9IEl0ZW07CgppbnQgY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKICAgIGlmICgoKEl0ZW0gKiliKS0+ciA+ICgoSXRlbSAqKWEpLT5yKSByZXR1cm4gMTsKICAgIGlmICgoKEl0ZW0gKiliKS0+ciA8ICgoSXRlbSAqKWEpLT5yKSByZXR1cm4gLTE7CiAgICByZXR1cm4gMDsKfQoKLy8gRnVuZ3NpIFNvbHVzaSBLbmFwc2Fjawpkb3VibGUga25hcHNhY2soSXRlbSBpdGVtc1tdLCBpbnQgbiwgaW50IGNhcGFjaXR5LCBpbnQgKnNpc2EpIHsKICAgIC8vIDEuIEhpdHVuZyBSYXNpbwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIGl0ZW1zW2ldLnIgPSAoZG91YmxlKWl0ZW1zW2ldLnYgLyBpdGVtc1tpXS53OwogICAgCiAgICAvLyAyLiBVcnV0a2FuIGJlcmRhc2Fya2FuIFJhc2lvCiAgICBxc29ydChpdGVtcywgbiwgc2l6ZW9mKEl0ZW0pLCBjbXApOwoKICAgIGRvdWJsZSB0b3RhbFZhbHVlID0gMC4wOwogICAgaW50IGN1cnJlbnRXZWlnaHQgPSAwOwoKICAgIC8vIDMuIEFtYmlsIEl0ZW0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaWYgKGN1cnJlbnRXZWlnaHQgKyBpdGVtc1tpXS53IDw9IGNhcGFjaXR5KSB7CiAgICAgICAgICAgIC8vIEFtYmlsIFV0dWgKICAgICAgICAgICAgY3VycmVudFdlaWdodCArPSBpdGVtc1tpXS53OwogICAgICAgICAgICB0b3RhbFZhbHVlICs9IGl0ZW1zW2ldLnY7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gQW1iaWwgU2ViYWdpYW4gKEZyYWN0aW9uYWwpCiAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBjYXBhY2l0eSAtIGN1cnJlbnRXZWlnaHQ7CiAgICAgICAgICAgIHRvdGFsVmFsdWUgKz0gaXRlbXNbaV0udiAqICgoZG91YmxlKXJlbWFpbmluZyAvIGl0ZW1zW2ldLncpOwogICAgICAgICAgICBjdXJyZW50V2VpZ2h0ID0gY2FwYWNpdHk7IC8vIEthcGFzaXRhcyBwZW51aAogICAgICAgICAgICBicmVhazsgCiAgICAgICAgfQogICAgfQogICAgKnNpc2EgPSBjYXBhY2l0eSAtIGN1cnJlbnRXZWlnaHQ7CiAgICByZXR1cm4gdG90YWxWYWx1ZTsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgbiA9IDU7CiAgICBpbnQgdmFsdWVzW10gPSB7NSwgNCwgNywgOCwgMTB9OwogICAgaW50IHdlaWdodHNbXSA9IHsxMCwgNSwgNywgMTIsIDh9OwogICAgaW50IGNhcGFjaXR5ID0gMjA7CgogICAgSXRlbSBpdGVtc1s1XTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaXRlbXNbaV0udiA9IHZhbHVlc1tpXTsKICAgICAgICBpdGVtc1tpXS53ID0gd2VpZ2h0c1tpXTsKICAgIH0KICAgIAogICAgaW50IHNpc2Ffa2FwYXNpdGFzOwogICAgZG91YmxlIG9wdGltYWxWYWx1ZSA9IGtuYXBzYWNrKGl0ZW1zLCBuLCBjYXBhY2l0eSwgJnNpc2Ffa2FwYXNpdGFzKTsKCiAgICAvLyAtLS0gSGFzaWwgVWppIFNlc3VhaSBQZXJtaW50YWFuIC0tLQogICAgcHJpbnRmKCJOaWxhaSBPcHRpbWFsOiAlLjBsZlxuIiwgb3B0aW1hbFZhbHVlKTsKICAgIHByaW50ZigiU2lzYSBLYXBhc2l0YXM6ICVkXG4iLCBzaXNhX2thcGFzaXRhcyk7CiAgICBwcmludGYoIktlbHVhcmFuIFNpbmdrYXQgKE5pbGFpIFNpc2EpOiAqKiUuMGxmICVkKipcbiIsIG9wdGltYWxWYWx1ZSwgc2lzYV9rYXBhc2l0YXMpOwoKICAgIHJldHVybiAwOwp9Cg==