#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Item {
char* name;
float totalWeight;
float totalValue;
};
struct PackedItem {
char* name;
float packedWeight;
};
void printItems(struct PackedItem* packedItems, int numItems) {
for (int i = 0; i < numItems; i++) {
printf("%s:%f\n", packedItems[i].name, packedItems[i].packedWeight);
}
}
int compareGreaterItemUnitPrice(const void* left, const void* right) {
float leftUnitPrice = ((struct Item*)left)->totalValue / ((struct Item*)left)->totalWeight;
float rightUnitPrice = ((struct Item*)right)->totalValue / ((struct Item*)right)->totalWeight;
return (leftUnitPrice > rightUnitPrice) ? -1 : 1;
}
void packItem(float packageWeight, struct Item* items, int numItems, struct PackedItem* packedItems, int* numPackedItems) {
qsort(items, numItems, sizeof(struct Item), compareGreaterItemUnitPrice);
float curWeight = 0.0;
*numPackedItems = 0;
for(int i = 0; i < numItems; i++) {
if (curWeight + items[i].totalWeight < packageWeight) {
packedItems[*numPackedItems].name = items[i].name;
packedItems[*numPackedItems].packedWeight = items[i].totalWeight;
(*numPackedItems)++;
curWeight += items[i].totalWeight;
}
else {
packedItems[*numPackedItems].name = items[i].name;
packedItems[*numPackedItems].packedWeight = packageWeight - curWeight;
(*numPackedItems)++;
break;
}
}
}
int main() {
struct Item items[5];
items[0] = (struct Item){"soybean", 100, 100};
items[1] = (struct Item){"mung bean", 30, 90};
items[2] = (struct Item){"red bean", 60, 120};
items[3] = (struct Item){"black bean", 20, 80};
items[4] = (struct Item){"green bean", 50, 75};
struct PackedItem packedItems[5];
int numPackedItems;
packItem(100, items, 5, packedItems, &numPackedItems);
printItems(packedItems, numPackedItems);
return 0;
}