- 论坛徽章:
- 2
|
本帖最后由 cobras 于 2014-08-28 10:28 编辑
没有用教材上的递推公式。用了一个笨方法实现。- /* knapsack.c */
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <time.h>
- struct item
- {
- int choosed;
- int id;
- int c;
- int w;
- };
- struct item *create_items(int n)
- {
- struct item *items;
- int size;
- int i;
- size = n * sizeof(struct item);
- items = (struct item *)malloc(size);
- if (items != NULL) {
- memset(items, 0, size);
- srand(time(NULL));
- for (i = 0; i < n; ++i) {
- items[i].choosed = 0;
- items[i].id = i;
- items[i].c = rand() % 100 + 1;
- items[i].w = rand() % 100;
- }
- return items;
- }
- return NULL;
- }
- 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->w * item2->c;
- data2 = item2->w * item1->c;
- 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 choose_items(struct item *items, int n, int v)
- {
- int i;
- for (i = 0; i < n; ++i) {
- if (items[i].c <= v) {
- items[i].choosed = 1;
- v -= items[i].c;
- }
- }
- return 0;
- }
- int print_items(struct item *items, int n)
- {
- int i;
- for (i = 0; i < n; ++i) {
- printf("id=%d, c=%d, w=%d, %s\n", items[i].id, items[i].c, items[i].w, items[i].choosed ? "CHOOSED" : "");
- }
- return 0;
- }
- int main(void)
- {
- struct item *items;
- int n;
- int v;
- n = 10;
- v = 100;
- printf("Please Input (N,V): ");
- scanf("%d %d", &n, &v);
- printf("N=%d, V=%d\n", n, v);
- items = create_items(n);
- if (items != NULL) {
- puts("SOURCE ITEMS:");
- print_items(items, n);
- qsort(items, n, sizeof(struct item), compare_item_value);
- puts("SORTED ITEMS:");
- print_items(items, n);
- choose_items(items, n, v);
- qsort(items, n, sizeof(struct item), compare_item_id);
- puts("CHOOSED ITEMS:");
- print_items(items, n);
- release_items(items);
- return 0;
- }
- return -1;
- }
复制代码 |
|