免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
51 [报告]
发表于 2014-08-28 10:44 |只看该作者
这个是??3个物品,容量为2...

QQ截图20140828104326.png (4.53 KB, 下载次数: 42)

QQ截图20140828104326.png

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

论坛徽章:
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
53 [报告]
发表于 2014-08-28 10:49 |只看该作者
我也来一个贪心的(是Codeforces上的一个题目,不过是每个物品只有容量1和2两个值)
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. struct Node
  4. {
  5.     int w;
  6.     int num;
  7. };

  8. Node Susake[100006];
  9. Node dp[100006];
  10. int a[100006];

  11. int comp(Node a, Node b)
  12. {
  13.     return a.w > b.w ? 1 : 0;
  14. }

  15. int main(int argc, char *argv[])
  16. {
  17.     int n, v, v1, v2, t1, t2;
  18.     memset(Susake, 0, sizeof(Susake));
  19.     memset(dp, 0, sizeof(dp));
  20.     scanf("%d%d", &n, &v);
  21.     t1 = t2 = 0;
  22.     for(int i = 1; i <= n; i++)
  23.     {
  24.         scanf("%d%d", &v1, &v2);
  25.         if(v1 == 1)
  26.         {
  27.             t1++;
  28.             Susake[t1].w = v2;
  29.             Susake[t1].num = i;
  30.         }
  31.         else
  32.         {
  33.             t2++;
  34.             dp[t2].w = v2;
  35.             dp[t2].num = i;
  36.         }
  37.     }
  38.     sort(Susake + 1, Susake + t1 + 1, comp);
  39.     sort(dp + 1, dp + t2 + 1, comp);
  40.     int k1 = 1, k2 = 1, j = 0, weight = 0;
  41.     memset(a, 0, sizeof(a));
  42.     if(v % 2 == 1 && Susake[k1].w * 2> dp[k2].w && v >= 1 && k1 <= t1)
  43.     {
  44.         weight += Susake[k1].w;
  45.         j++;
  46.         a[j] = Susake[k1].num;
  47.         k1++;
  48.         v--;
  49.     }
  50.     while(v)
  51.     {
  52.         if(k1 > t1 && k2 > t2) break;
  53.         if(k1 + 1 <= t1 && k2 <= t2 && v >= 2)
  54.         {
  55.             if(Susake[k1].w + Susake[k1 + 1].w > dp[k2].w)
  56.             {
  57.                 weight += Susake[k1].w + Susake[k1 + 1].w;
  58.                 j++;
  59.                 a[j] = Susake[k1].num;
  60.                 j++;
  61.                 a[j] = Susake[k1 + 1].num;
  62.                 k1 += 2;
  63.                 v -= 2;
  64.             }
  65.             else
  66.             {
  67.                 weight += dp[k2].w;
  68.                 j++;
  69.                 a[j] = dp[k2].num;
  70.                 k2++;
  71.                 v -= 2;
  72.             }
  73.         }
  74.         else if(k2 <= t2 && v >= 2 && k1 + 1 > t1)
  75.         {
  76.             weight += dp[k2].w;
  77.             j++;
  78.             a[j] = dp[k2].num;
  79.             k2++;
  80.             v -= 2;
  81.         }
  82.         else if(k2 > t2 && v >= 1 && k1 <= t1)
  83.         {
  84.             weight += Susake[k1].w;
  85.             j++;
  86.             a[j] = Susake[k1].num;
  87.             k1++;
  88.             v--;
  89.         }
  90.         else
  91.         {
  92.             if(k1 <= t1 && v >= 1)
  93.             {
  94.                 weight += Susake[k1].w;
  95.                 j++;
  96.                 a[j] = Susake[k1].num;
  97.                 k1++;
  98.                 v--;
  99.             }
  100.             else if(k2 <= t2 && v >= 2)
  101.             {
  102.                 weight += dp[k2].w;
  103.                 j++;
  104.                 a[j] = dp[k2].num;
  105.                 k2++;
  106.                 v -= 2;
  107.             }
  108.             else break;
  109.         }
  110.     }
  111.     printf("%d\n", weight);
  112.     if(j > 0)
  113.     {
  114.         if(j == 1)
  115.             printf("%d\n", a[1]);
  116.         else
  117.         {
  118.             for(int i = 1; i <= j - 1; i++)
  119.                 printf("%d ", a[i]);
  120.             printf("%d\n", a[j]);
  121.         }
  122.     }
  123.     return 0;
  124. }
复制代码

QQ截图20140828103729.png (5.92 KB, 下载次数: 43)

QQ截图20140828103729.png

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

论坛徽章:
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
55 [报告]
发表于 2014-08-28 10:53 |只看该作者
本帖最后由 fender0107401 于 2014-08-28 10:55 编辑

算了,还是编辑掉吧。

论坛徽章:
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
56 [报告]
发表于 2014-08-28 10:55 |只看该作者
回复 55# fender0107401

学生,平时闲的时候弄弄~
   

论坛徽章:
1
亥猪
日期:2014-09-10 11:43:17
57 [报告]
发表于 2014-08-28 10:56 |只看该作者
上面的C代码同之前的m代码用的是同样的算法,优先选取价值与质量比最高的放入背包。这种贪心算法效率很高,进行一次排序和一次扫描就能完成,但很多时候只能得到近似解,并不能得到最优解,所以也是错的

论坛徽章:
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
58 [报告]
发表于 2014-08-28 10:56 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
59 [报告]
发表于 2014-08-28 10:57 |只看该作者
__BlueGuy_ 发表于 2014-08-28 10:56
真有意思!我用的着去裸奔么?你以为你有水平可以让我裸奔么?
这么一个简单的基础题,walleeee、star ...


hi,3,早上吃了吗?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
60 [报告]
发表于 2014-08-28 10:58 |只看该作者
__BlueGuy_ 发表于 2014-08-28 10:56
真有意思!我用的着去裸奔么?你以为你有水平可以让我裸奔么?
这么一个简单的基础题,walleeee、star ...

三爷,悄悄的说一句,那个东西叫matlab
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP