免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3096 | 回复: 13
打印 上一主题 下一主题

[算法] 求教一算法(阿里巴巴进山洞取宝) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-17 20:30 |只看该作者 |倒序浏览
1。在山洞中有M件财宝,
2。价值为P1,P2.......PM
3。重两为W1,W2......WM
阿里巴巴有一个带子可放N重的物品
问1,他要那些物品时,能得到最大的价值。
   2。若有X人同行时,袋子为N1,N2 .....NX时如何得到最大价值。

只要算法,不求运算能否实现

论坛徽章:
0
2 [报告]
发表于 2003-05-17 20:57 |只看该作者

求教一算法(阿里巴巴进山洞取宝)

只能穷举。

论坛徽章:
0
3 [报告]
发表于 2003-05-17 21:48 |只看该作者

求教一算法(阿里巴巴进山洞取宝)

如果求最优解,只能穷举,比较慢。
如果求工程上的相对优解,可以利用神经网络或者遗传算法进行优选。

论坛徽章:
0
4 [报告]
发表于 2003-05-18 14:14 |只看该作者

求教一算法(阿里巴巴进山洞取宝)

应该是不用
好像登山法就是解这种问题的
就是如果往一条路走不通时退一步走下一条路
如果所有路都不通那么退回上一条

这样性能比较快
如果是使用穷举的话性能是很慢的

我以前贴的算法中有各种算法说明
你先看看有没有
或是上google查找

论坛徽章:
0
5 [报告]
发表于 2003-05-18 14:46 |只看该作者

求教一算法(阿里巴巴进山洞取宝)

原帖由 "无双" 发表:
应该是不用
好像登山法就是解这种问题的
就是如果往一条路走不通时退一步走下一条路
如果所有路都不通那么退回上一条


你这不就是穷举吗?树的深度优先遍历。
因为要求的不是“如何登上山顶”,而是“如何用最短路径登上山顶”,所以不论你用深度优先还是广度优先,都必须穷举之后才能得到解。

这种发散性问题没有系统解法求最优解,只能求出相对优解。

论坛徽章:
0
6 [报告]
发表于 2003-05-18 14:49 |只看该作者

求教一算法(阿里巴巴进山洞取宝)

不是穷举
穷举要举所有可能

但是我的话只是说如果按一条路走
如果某一步走不通了再返回一步,
所以可能性小多了

另外这个问题在算法书中都有
到时回去看看

论坛徽章:
0
7 [报告]
发表于 2003-05-18 14:56 |只看该作者

求教一算法(阿里巴巴进山洞取宝)

我提出一个近似解法:
计算出所有物品的价格质量比(记做c),并排序。
优先装进c较大的物品;
如果包没有装满,而因为超重无法放入任何物品时,取出最后放入的物品,把剩下的物品按P重新排序,按排序顺序寻找W最合适的物品放入即可。

论坛徽章:
0
8 [报告]
发表于 2003-05-18 14:59 |只看该作者

求教一算法(阿里巴巴进山洞取宝)

原帖由 "无双" 发表:
不是穷举
穷举要举所有可能

但是我的话只是说如果按一条路走
如果某一步走不通了再返回一步,
所以可能性小多了

另外这个问题在算法书中都有
到时回去看看


问题是你只有穷举所有的可能才能找到最优解。利用搜索法能够更快地找到任意解,但是穷举所有解的时候不会节省时间(甚至相反)。

论坛徽章:
0
9 [报告]
发表于 2003-05-18 15:27 |只看该作者

求教一算法(阿里巴巴进山洞取宝)

同意
如果数量很大的话
那么要穷举时所用的时间是不可接受的

论坛徽章:
0
10 [报告]
发表于 2003-05-18 18:09 |只看该作者

求教一算法(阿里巴巴进山洞取宝)

时间仓促,没来得及校对,简单测试了一下,似乎没问题。
权做抛砖引玉。


  1. #include <stdio.h>;
  2. #define jewel_count 7  /* 财宝个数 */
  3. #define MAXWEIGHT 6  /* 最大承重 */

  4. int bag[jewel_count];
  5. int got_count=0;
  6.         
  7. int best_bag[jewel_count];
  8. int best_got_count=0;
  9. int best_value=0;
  10.                
  11. struct jewel_type
  12. {      
  13.         int p; /* Cost */
  14.         int w; /* Weight */
  15. };

  16. struct jewel_type jewel[jewel_count];

  17. void
  18. init_hole()
  19. {               
  20.         int i;
  21.         int c;
  22.         FILE *fp;

  23.         fp=fopen("/dev/urandom","r");
  24.         for (i=0;i<jewel_count;i++) {
  25.                 c=fgetc(fp)%5+1;  /* 重量和价值取1-5随机值 */
  26.                 jewel[i].p=c;
  27.                 c=fgetc(fp)%5+1;
  28.                 jewel[i].w=c;
  29.         }
  30.         fclose(fp);
  31. }

  32. int
  33. exists(int n)
  34. {
  35.         int i;

  36.         for (i=0;i<got_count;i++) {
  37.                 if (bag[i]==n) return 1;
  38.         }
  39.         return(0);
  40. }

  41. void
  42. output()
  43. {
  44.         int i;
  45.         for (i=0;i<got_count;i++) {
  46.                 printf("%d ",bag[i]);
  47.         }
  48.         printf("\n");
  49. }

  50. int
  51. weight()
  52. {
  53.         int i,sum=0;
  54.         for (i=0;i<got_count;i++) {
  55.                 sum+=jewel[bag[i]].w;
  56.         }
  57.         return sum;
  58. }

  59. int
  60. value()
  61. {
  62.         int i,sum=0;
  63.         for (i=0;i<got_count;i++) {
  64.                 sum+=jewel[bag[i]].p;
  65.         }
  66.         return sum;
  67. }

  68. void
  69. refresh()
  70. {
  71.         int i;
  72.         if (value()>;=best_value) {
  73.                 for (i=0;i<got_count;i++) {
  74.                         best_bag[i]=bag[i];
  75.                 }
  76.                 best_got_count=got_count;
  77.                 best_value=value();
  78.         }
  79. }

  80. void
  81. resolv()
  82. {
  83.         int i,temp;
  84.         int tempweight;

  85.         if ((tempweight=weight())<=MAXWEIGHT) {
  86.                 refresh();
  87.                 output();
  88.         }
  89.         if (tempweight>;MAXWEIGHT) {
  90.                 return;
  91.         }
  92.         for (i=got_count;weight()<=MAXWEIGHT && i<jewel_count;i++) {
  93.                 if (exists(i)==0) {
  94.                         bag[got_count++]=i;
  95.                         resolv();
  96.                         got_count--;
  97.                 }
  98.         }
  99. }

  100. void
  101. outputbest()
  102. {
  103.         int i,weight=0,value=0;

  104.         printf("Best answer is:");
  105.         for (i=0;i<best_got_count;i++) {
  106.                 printf("%d ",best_bag[i]);
  107.                 weight+=jewel[best_bag[i]].w;
  108.                 value+=jewel[best_bag[i]].p;
  109.         }
  110.         printf("\nvalue is: %d\tweight is: %d\n",value,weight);
  111. }

  112. main()
  113. {
  114.         int i;
  115.         init_hole();
  116.         for (i=0;i<jewel_count;i++) {
  117.                 printf("Jewel No%d: \t cost=%d \tweight=%d\n",i,jewel[i].p,jewel[i].w);
  118.         }
  119.         resolv();
  120.         outputbest();
  121. }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP