免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: fender0107401
打印 上一主题 下一主题

[算法] 算了算了,我错了,以后不这么玩了。 [复制链接]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
1 [报告]
发表于 2014-08-28 10:22 |显示全部楼层
本帖最后由 cobras 于 2014-08-28 10:28 编辑

没有用教材上的递推公式。用了一个笨方法实现。
  1. /* knapsack.c */

  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <time.h>

  6. struct item
  7. {
  8.         int choosed;
  9.         int id;
  10.         int c;
  11.         int w;
  12. };

  13. struct item *create_items(int n)
  14. {
  15.         struct item *items;
  16.         int size;
  17.         int i;

  18.         size = n * sizeof(struct item);
  19.         items = (struct item *)malloc(size);
  20.         if (items != NULL) {
  21.                 memset(items, 0, size);
  22.                 srand(time(NULL));
  23.                 for (i = 0; i < n; ++i) {
  24.                         items[i].choosed = 0;
  25.                         items[i].id = i;
  26.                         items[i].c = rand() % 100 + 1;
  27.                         items[i].w = rand() % 100;
  28.                 }
  29.                 return items;
  30.         }
  31.         return NULL;
  32. }

  33. int release_items(struct item *items)
  34. {
  35.         free(items);
  36.         return 0;
  37. }

  38. int compare_item_value(const struct item *item1, const struct item *item2)
  39. {
  40.         long data1, data2;

  41.         data1 = item1->w * item2->c;
  42.         data2 = item2->w * item1->c;
  43.         if (data1 < data2) {
  44.                 return 1;
  45.         }else if (data1 > data2) {
  46.                 return -1;
  47.         }else {
  48.                 return 0;
  49.         }
  50. }

  51. int compare_item_id(const struct item *item1, const struct item *item2)
  52. {
  53.         if (item1->id < item2->id) {
  54.                 return -1;
  55.         }else if (item1->id > item2->id) {
  56.                 return 1;
  57.         }else {
  58.                 return 0;
  59.         }
  60. }

  61. int choose_items(struct item *items, int n, int v)
  62. {
  63.         int i;

  64.         for (i = 0; i < n; ++i) {
  65.                 if (items[i].c <= v) {
  66.                         items[i].choosed = 1;
  67.                         v -= items[i].c;
  68.                 }
  69.         }
  70.         return 0;
  71. }

  72. int print_items(struct item *items, int n)
  73. {
  74.         int i;

  75.         for (i = 0; i < n; ++i) {
  76.                 printf("id=%d, c=%d, w=%d, %s\n", items[i].id, items[i].c, items[i].w, items[i].choosed ? "CHOOSED" : "");
  77.         }
  78.         return 0;
  79. }

  80. int main(void)
  81. {
  82.         struct item *items;
  83.         int n;
  84.         int v;

  85.         n = 10;
  86.         v = 100;
  87.         printf("Please Input (N,V): ");
  88.         scanf("%d %d", &n, &v);
  89.         printf("N=%d, V=%d\n", n, v);
  90.         items = create_items(n);
  91.         if (items != NULL) {
  92.                 puts("SOURCE ITEMS:");
  93.                 print_items(items, n);
  94.                 qsort(items, n, sizeof(struct item), compare_item_value);
  95.                 puts("SORTED ITEMS:");
  96.                 print_items(items, n);
  97.                 choose_items(items, n, v);
  98.                 qsort(items, n, sizeof(struct item), compare_item_id);
  99.                 puts("CHOOSED ITEMS:");
  100.                 print_items(items, n);
  101.                 release_items(items);
  102.                 return 0;
  103.         }
  104.         return -1;
  105. }
复制代码

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
2 [报告]
发表于 2014-08-28 10:46 |显示全部楼层
当然,因为任何一个东西都装不下。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
3 [报告]
发表于 2014-08-28 10:52 |显示全部楼层
回复 45# Susake_

c++适用版。{:3_204:}

  1. /* knapsack.c */

  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <time.h>

  6. struct item
  7. {
  8.         int choosed;
  9.         int id;
  10.         int c;
  11.         int w;
  12. };

  13. struct item *create_items(int n)
  14. {
  15.         struct item *items;
  16.         int size;
  17.         int i;

  18.         size = n * sizeof(struct item);
  19.         items = (struct item *)malloc(size);
  20.         if (items != NULL) {
  21.                 memset(items, 0, size);
  22.                 srand(time(NULL));
  23.                 for (i = 0; i < n; ++i) {
  24.                         items[i].choosed = 0;
  25.                         items[i].id = i;
  26.                         items[i].c = rand() % 100 + 1;
  27.                         items[i].w = rand() % 100;
  28.                 }
  29.                 return items;
  30.         }
  31.         return NULL;
  32. }

  33. int release_items(struct item *items)
  34. {
  35.         free(items);
  36.         return 0;
  37. }

  38. int compare_item_value(const struct item *item1, const struct item *item2)
  39. {
  40.         long data1, data2;

  41.         data1 = item1->w * item2->c;
  42.         data2 = item2->w * item1->c;
  43.         if (data1 < data2) {
  44.                 return 1;
  45.         }else if (data1 > data2) {
  46.                 return -1;
  47.         }else {
  48.                 return 0;
  49.         }
  50. }

  51. int compare_item_id(const struct item *item1, const struct item *item2)
  52. {
  53.         if (item1->id < item2->id) {
  54.                 return -1;
  55.         }else if (item1->id > item2->id) {
  56.                 return 1;
  57.         }else {
  58.                 return 0;
  59.         }
  60. }

  61. int choose_items(struct item *items, int n, int v)
  62. {
  63.         int i;

  64.         for (i = 0; i < n; ++i) {
  65.                 if (items[i].c <= v) {
  66.                         items[i].choosed = 1;
  67.                         v -= items[i].c;
  68.                 }
  69.         }
  70.         return 0;
  71. }

  72. int print_items(struct item *items, int n)
  73. {
  74.         int i;

  75.         for (i = 0; i < n; ++i) {
  76.                 printf("id=%d, c=%d, w=%d, %s\n", items[i].id, items[i].c, items[i].w, items[i].choosed ? "CHOOSED" : "");
  77.         }
  78.         return 0;
  79. }

  80. int main(void)
  81. {
  82.         struct item *items;
  83.         int n;
  84.         int v;

  85.         n = 10;
  86.         v = 100;
  87.         printf("Please Input (N,V): ");
  88.         scanf("%d %d", &n, &v);
  89.         printf("N=%d, V=%d\n", n, v);
  90.         items = create_items(n);
  91.         if (items != NULL) {
  92.                 puts("SOURCE ITEMS:");
  93.                 print_items(items, n);
  94.                 qsort(items, n, sizeof(struct item), (int(*)(const void*,const void*))compare_item_value);
  95.                 puts("SORTED ITEMS:");
  96.                 print_items(items, n);
  97.                 choose_items(items, n, v);
  98.                 qsort(items, n, sizeof(struct item), (int(*)(const void*,const void*))compare_item_id);
  99.                 puts("CHOOSED ITEMS:");
  100.                 print_items(items, n);
  101.                 release_items(items);
  102.                 return 0;
  103.         }
  104.         return -1;
  105. }
复制代码

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
4 [报告]
发表于 2014-08-28 12:34 |显示全部楼层
原来的算法真的不行。贪心法求的只是一个近似值。多试几次就会发现。
另外,递推法如何得出选择的结果集?
  1. /* knapsack.c */

  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <time.h>

  6. struct item
  7. {
  8.         int choosed;
  9.         int id;
  10.         int c;
  11.         int w;
  12. };

  13. struct item *create_items(int n)
  14. {
  15.         struct item *items;
  16.         int size;
  17.         int i;

  18.         size = n * sizeof(struct item);
  19.         items = (struct item *)malloc(size);
  20.         if (items != NULL) {
  21.                 memset(items, 0, size);
  22.                 srand(time(NULL));
  23.                 for (i = 0; i < n; ++i) {
  24.                         items[i].choosed = 0;
  25.                         items[i].id = i;
  26.                         items[i].c = rand() % 100 + 1;
  27.                         items[i].w = rand() % 100;
  28.                 }
  29.                 return items;
  30.         }
  31.         return NULL;
  32. }

  33. int release_items(struct item *items)
  34. {
  35.         free(items);
  36.         return 0;
  37. }

  38. int compare_item_value(const struct item *item1, const struct item *item2)
  39. {
  40.         long data1, data2;

  41.         data1 = item1->w * item2->c;
  42.         data2 = item2->w * item1->c;
  43.         if (data1 < data2) {
  44.                 return 1;
  45.         }else if (data1 > data2) {
  46.                 return -1;
  47.         }else {
  48.                 return 0;
  49.         }
  50. }

  51. int compare_item_id(const struct item *item1, const struct item *item2)
  52. {
  53.         if (item1->id < item2->id) {
  54.                 return -1;
  55.         }else if (item1->id > item2->id) {
  56.                 return 1;
  57.         }else {
  58.                 return 0;
  59.         }
  60. }

  61. int choose_items(struct item *items, int n, int v)
  62. {
  63.         int i;

  64.         for (i = 0; i < n; ++i) {
  65.                 if (items[i].c <= v) {
  66.                         items[i].choosed = 1;
  67.                         v -= items[i].c;
  68.                 }
  69.         }
  70.         return 0;
  71. }

  72. int print_items(struct item *items, int n)
  73. {
  74.         int i;

  75.         for (i = 0; i < n; ++i) {
  76.                 printf("id=%d, c=%d, w=%d, %s\n", items[i].id, items[i].c, items[i].w, items[i].choosed ? "CHOOSED" : "");
  77.         }
  78.         return 0;
  79. }

  80. int knapsack_items(struct item *items, int N, int V)
  81. {
  82.         int *f;
  83.         int i;
  84.         int v;
  85.         int size;
  86.         int value;

  87.         size = (V + 1) * sizeof(int);
  88.         f = (int *)malloc(size);
  89.         if (f != NULL) {
  90.                 memset(f, 0, size);
  91.                 for(i = 0; i < N; ++i) {
  92.                         for(v = V; v >= items[i].c; --v) {
  93.                                 value = f[v - items[i].c] + items[i].w;
  94.                                 if (value > f[v]) {
  95.                                         f[v] = value;
  96.                                 }
  97.                         }
  98.                 }
  99.                 value = f[V];
  100.                 free(f);
  101.                 return value;
  102.         }
  103.         return -1;
  104. }

  105. int clear_items_choose(struct item *items, int n)
  106. {
  107.         int i;

  108.         for (i = 0; i < n; ++i) {
  109.                 items[i].choosed = 0;
  110.         }
  111.         return 0;
  112. }

  113. int sum_choosed_item(struct item *items, int n)
  114. {
  115.         int i;
  116.         int sum;

  117.         sum = 0;
  118.         for (i = 0; i < n; ++i) {
  119.                 if (items[i].choosed) {
  120.                         sum += items[i].w;
  121.                 }
  122.         }
  123.         return sum;
  124. }

  125. int main(void)
  126. {
  127.         struct item *items;
  128.         int n;
  129.         int v;
  130.         int value;

  131.         n = 10;
  132.         v = 100;
  133.         printf("Please Input (N,V): ");
  134.         scanf("%d %d", &n, &v);
  135.         printf("N=%d, V=%d\n", n, v);
  136.         items = create_items(n);
  137.         if (items != NULL) {
  138.                 puts("SOURCE ITEMS:");
  139.                 print_items(items, n);
  140.                 qsort(items, n, sizeof(struct item), (int(*)(const void*,const void*))compare_item_value);
  141.                 puts("SORTED ITEMS:");
  142.                 print_items(items, n);
  143.                 choose_items(items, n, v);
  144.                 qsort(items, n, sizeof(struct item), (int(*)(const void*,const void*))compare_item_id);
  145.                 puts("CHOOSED ITEMS:");
  146.                 print_items(items, n);
  147.                 printf("SUM choosed value: %d\n", sum_choosed_item(items, n));

  148.                 clear_items_choose(items, n);
  149.                 value = knapsack_items(items, n, v);
  150.                 puts("KNAPSACK CHOOSED ITEMS:");
  151.                 print_items(items, n);
  152.                 printf("KNAPSACK VALUE: %d\n", value);
  153.                 release_items(items);
  154.                 return 0;
  155.         }
  156.         return -1;
  157. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP