- 论坛徽章:
- 2
|
发个背包问题贪心算法与动态规划比较。少数情况下贪心算法不能求最佳答案。- /* knapsack.c */
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <time.h>
- struct item
- {
- int choosed;
- int id;
- int size;
- int value;
- };
- struct item *create_items(int count)
- {
- struct item *items;
- int size;
- size = count * sizeof(struct item);
- items = (struct item *)malloc(size);
- if (items != NULL) {
- memset(items, 0, size);
- return items;
- }
- return NULL;
- }
- int generate_items(struct item *items, int count)
- {
- int i;
- memset(items, 0, count * sizeof(struct item));
- srand(time(NULL));
- for (i = 0; i < count; ++i) {
- items[i].choosed = 0;
- items[i].id = i;
- items[i].size = rand() % 100 + 1;
- items[i].value = rand() % 100;
- }
- return 0;
- }
- int release_items(struct item *items)
- {
- free(items);
- return 0;
- }
- int compare_item_value(const struct item *item1, const struct item *item2)
- {
- long data1, data2;
- data1 = item1->value * item2->size;
- data2 = item2->value * item1->size;
- if (data1 < data2) {
- return 1;
- }else if (data1 > data2) {
- return -1;
- }else {
- return 0;
- }
- }
- int compare_item_id(const struct item *item1, const struct item *item2)
- {
- if (item1->id < item2->id) {
- return -1;
- }else if (item1->id > item2->id) {
- return 1;
- }else {
- return 0;
- }
- }
- int compare_item_c(const struct item *item1, const struct item *item2)
- {
- if (item1->size < item2->size) {
- return -1;
- }else if (item1->size > item2->size) {
- return 1;
- }else {
- return 0;
- }
- }
- int choose_items(struct item *items, int count, int capability)
- {
- int i;
- for (i = 0; i < count; ++i) {
- if (items[i].size <= capability) {
- items[i].choosed = 1;
- capability -= items[i].size;
- }
- }
- return 0;
- }
- int print_items(struct item *items, int count)
- {
- int i;
- for (i = 0; i < count; ++i) {
- printf("id=%d, size=%d, value=%d, %d\n", items[i].id, items[i].size, items[i].value, items[i].choosed);
- }
- return 0;
- }
- int knapsack_items(struct item *items, int count, int capability)
- {
- int *f;
- int *line;
- int i;
- int j;
- int size;
- int value;
- size = count * (capability + 1) * sizeof(int);
- f = (int *)malloc(size);
- if (f != NULL) {
- memset(f, 0, size);
- line = f + (count - 1) * (capability + 1);
- for (j = 0; j <= capability; j++) {
- if(j < items[count - 1].size) {
- line[j] = 0;
- }else {
- line[j] = items[count - 1].value;
- }
- }
- for(i = count - 2; i >= 0; i--) {
- line -= capability + 1;
- for (j = 0; j <= capability; j++) {
- if(j < items[i].size) {
- line[j] = (line + capability + 1)[j];
- }else {
- line[j] = (line + capability + 1)[j] > (line + capability + 1)[j-items[i].size] + items[i].value ? (line + capability + 1)[j] : (line + capability + 1)[j-items[i].size] + items[i].value;
- }
- }
- }
- value = line[capability];
- j = capability;
- for(i = 0; i <= count - 2; i++) {
- if(f[i * (capability + 1) + j] == f[(i + 1) * (capability + 1) + j]) {
- items[i].choosed = 0;
- }else {
- items[i].choosed = 1;
- j = j - items[i].size;
- }
- }
- items[count - 1].choosed = f[(count - 1) * (capability + 1) + j] ? 1 : 0;
- free(f);
- return value;
- }
- return -1;
- }
- int clear_items_choose(struct item *items, int count)
- {
- int i;
- for (i = 0; i < count; ++i) {
- items[i].choosed = 0;
- }
- return 0;
- }
- int sum_choosed_item_value(struct item *items, int count)
- {
- int i;
- int sum;
- sum = 0;
- for (i = 0; i < count; ++i) {
- if (items[i].choosed) {
- sum += items[i].value;
- }
- }
- return sum;
- }
- int sum_choosed_item_capability(struct item *items, int count)
- {
- int i;
- int sum;
-
- sum = 0;
- for (i = 0; i < count; ++i) {
- if (items[i].choosed) {
- sum += items[i].size;
- }
- }
- return sum;
- }
- int main(void)
- {
- struct item *items;
- int count;
- int capability;
- int value;
- int a_value;
- int cnt;
- count = 10;
- capability = 100;
- printf("Please Input (Count, Capability): ");
- scanf("%d %d", &count, &capability);
- printf("N=%d, V=%d\n", count, capability);
- items = create_items(count);
- if (items != NULL) {
- cnt = 1;
- do {
- generate_items(items, count);
- printf("-------------- ITEM %d -------------\n", cnt);
- qsort(items, count, sizeof(struct item), (int(*)(const void*,const void*))compare_item_value);
- choose_items(items, count, capability);
- print_items(items, count);
- a_value = sum_choosed_item_value(items, count);
- printf("Choosed value: %d\n", a_value);
- printf("SUM choosed capability: %d\n", sum_choosed_item_capability(items, count));
- clear_items_choose(items, count);
- value = knapsack_items(items, count, capability);
- print_items(items, count);
- printf("KNAPSACK VALUE: %d\n", value);
- printf("SUM choosed capability: %d\n", sum_choosed_item_capability(items, count));
- ++cnt;
- }while (a_value == value);
- release_items(items);
- return 0;
- }
- return -1;
- }
复制代码 |
|