#include <stdio.h>
#include <stdlib.h>
typedef struct {
int value;
int weight;
double ratio;
} Bean;
int compare(const void *a, const void *b) {
Bean *beanA = (Bean *)a;
Bean *beanB = (Bean *)b;
if(beanA->ratio < beanB->ratio) return 1;
if(beanA->ratio > beanB->ratio) return -1;
return 0;
}
double fractionalKnapsack(int W, Bean beans[], int n) {
for(int i = 0; i < n; i++) {
beans[i].ratio = (double)beans[i].value / beans[i].weight;
}
qsort(beans, n, sizeof(Bean), compare);
int currentWeight = 0;
double finalValue = 0.0;
for(int i = 0; i < n; i++) {
if(currentWeight + beans[i].weight <= W) {
currentWeight += beans[i].weight;
finalValue += beans[i].value;
} else {
int remain = W - currentWeight;
finalValue += beans[i].ratio * remain;
break;
}
}
return finalValue;
}
int main() {
Bean beans[] = {{60, 10}, {100, 20}, {120, 30}};
int W = 50;
int n = sizeof(beans)/sizeof(beans[0]);
printf("Maximum value we can obtain = %lf", fractionalKnapsack(W, beans, n));
return 0;
}