免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
亥猪
日期:2014-09-10 11:43:17
61 [报告]
发表于 2014-08-28 10:59 |只看该作者
唉,平板敲字还是慢啊,前贴中说的上一段指的是前一页里第一段c代码。总之01背包就不能用贪心发法

论坛徽章:
11
巨蟹座
日期:2013-12-23 11:12:14双子座
日期:2014-08-28 09:14:55子鼠
日期:2014-07-25 16:21:22摩羯座
日期:2014-07-23 15:17:47摩羯座
日期:2014-05-30 13:09:05午马
日期:2014-04-30 18:10:00天秤座
日期:2014-04-25 12:12:00申猴
日期:2014-04-22 11:30:15午马
日期:2014-03-07 16:06:40辰龙
日期:2013-12-25 18:36:00摩羯座
日期:2014-09-02 17:00:55
62 [报告]
发表于 2014-08-28 11:01 |只看该作者
回复 61# Kurosaki_Ichigo

是啊,背包用贪心是无法解得最优解的~我那题之所以用贪心,也是题目设计的,数据量是10^6,2重for必超,而特殊的是这题的每个物品容量只有1和2
   

论坛徽章:
1
亥猪
日期:2014-09-10 11:43:17
63 [报告]
发表于 2014-08-28 11:01 |只看该作者
这贴这么火?在我敲字的时候就多了N贴

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
64 [报告]
发表于 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. }
复制代码

论坛徽章:
0
65 [报告]
发表于 2014-08-28 12:59 |只看该作者
约瑟夫·维萨里奥诺维奇·斯大林同志说的对。

有理想的人,生活总是火热的。

论坛徽章:
35
双子座
日期:2014-05-09 17:56:38程序设计版块每日发帖之星
日期:2015-08-30 06:20:00程序设计版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-27 11:07:07程序设计版块每日发帖之星
日期:2016-01-12 06:20:0015-16赛季CBA联赛之北京
日期:2016-01-15 01:01:2115-16赛季CBA联赛之浙江
日期:2016-01-15 22:38:20程序设计版块每日发帖之星
日期:2016-01-18 06:20:00每日论坛发贴之星
日期:2016-01-18 06:20:0015-16赛季CBA联赛之北控
日期:2016-01-30 21:43:01程序设计版块每日发帖之星
日期:2016-02-08 06:20:0015-16赛季CBA联赛之山西
日期:2016-02-20 10:54:41
66 [报告]
发表于 2014-08-28 16:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
67 [报告]
发表于 2014-08-28 16:41 |只看该作者
__BlueGuy_ 发表于 2014-08-28 16:37
大家现在对你的 "专长" 都了解了


hi,3,今天心情怎么样?

论坛徽章:
35
双子座
日期:2014-05-09 17:56:38程序设计版块每日发帖之星
日期:2015-08-30 06:20:00程序设计版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-27 11:07:07程序设计版块每日发帖之星
日期:2016-01-12 06:20:0015-16赛季CBA联赛之北京
日期:2016-01-15 01:01:2115-16赛季CBA联赛之浙江
日期:2016-01-15 22:38:20程序设计版块每日发帖之星
日期:2016-01-18 06:20:00每日论坛发贴之星
日期:2016-01-18 06:20:0015-16赛季CBA联赛之北控
日期:2016-01-30 21:43:01程序设计版块每日发帖之星
日期:2016-02-08 06:20:0015-16赛季CBA联赛之山西
日期:2016-02-20 10:54:41
68 [报告]
发表于 2014-08-28 16:55 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
69 [报告]
发表于 2014-08-28 17:08 |只看该作者
__BlueGuy_ 发表于 2014-08-28 16:55
你的技术水平我早就一清二楚了
permofc说的那段话,很明显说的就是你啊
三爷开源的代码都有20000行,难不 ...


行,你不出去裸奔就行,别的都好说。

你牛逼,我们都知道。

论坛徽章:
35
双子座
日期:2014-05-09 17:56:38程序设计版块每日发帖之星
日期:2015-08-30 06:20:00程序设计版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-27 11:07:07程序设计版块每日发帖之星
日期:2016-01-12 06:20:0015-16赛季CBA联赛之北京
日期:2016-01-15 01:01:2115-16赛季CBA联赛之浙江
日期:2016-01-15 22:38:20程序设计版块每日发帖之星
日期:2016-01-18 06:20:00每日论坛发贴之星
日期:2016-01-18 06:20:0015-16赛季CBA联赛之北控
日期:2016-01-30 21:43:01程序设计版块每日发帖之星
日期:2016-02-08 06:20:0015-16赛季CBA联赛之山西
日期:2016-02-20 10:54:41
70 [报告]
发表于 2014-08-28 17:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP