#include <stdio.h>
#include <stdlib.h>
typedef struct {
double weight;
double value;
} Bean;
int cmp(const void *a, const void *b) {
Bean *bean1 = (Bean *) a;
Bean *bean2 = (Bean *) b;
double vpw1 = bean1->value / bean1->weight;
double vpw2 = bean2->value / bean2->weight;
if (vpw1 > vpw2) {
return -1;
} else if (vpw1 < vpw2) {
return 1;
} else {
return 0;
}
}
void knapsack_greedy(Bean *beans, int n, double capacity, double *total_value, Bean **selected_items) {
if (n <= 0 || capacity <= 0) {
*total_value = 0;
*selected_items = NULL;
return;
}
qsort(beans, n, sizeof(Bean), cmp);
double curr_capacity = capacity;
double curr_value = 0;
Bean *items = (Bean *) malloc(n * sizeof(Bean));
int num_items = 0;
for (int i = 0; i < n && curr_capacity > 0; i++) {
if (beans[i].weight <= curr_capacity) {
curr_capacity -= beans[i].weight;
curr_value += beans[i].value;
items[num_items++] = beans[i];
}
}
*total_value = curr_value;
*selected_items = items;
}
int main() {
Bean beans[] = {{2, 3}, {3, 4}, {4, 5}, {5, 6}};
int n = sizeof(beans) / sizeof(Bean);
double capacity = 8;
double total_value;
Bean *selected_items;
knapsack_greedy(beans, n, capacity, &total_value, &selected_items);
printf("总的价值: %g\n", total_value);
printf("Selected items:\n");
for (int i = 0; i < n && selected_items != NULL; i++) {
printf("重量: %g, 价值: %g\n", selected_items[i].weight, selected_items[i].value);
}
free(selected_items);
return 0;
}