免费注册 查看新帖 |

Chinaunix

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

考考大家一道某著名IT的面试题 [复制链接]

论坛徽章:
0
61 [报告]
发表于 2010-08-20 17:38 |只看该作者
有没有做出来,把代码贴出来浏览一下。。。我是新手

论坛徽章:
0
62 [报告]
发表于 2010-08-20 18:11 |只看该作者
看不懂,不知何意呀

论坛徽章:
0
63 [报告]
发表于 2010-08-20 18:17 |只看该作者
回复 61# 叼着馒头看电视


失望了,
这是我在47楼发的,希望你可以帮我检查一下,告诉我对不对
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(int argc, char **argv)
  4. {
  5.         int        w, q, i, k;

  6.         if (argc < 2) {
  7.                 fprintf(stderr, "Usage: %s w ...", argv[0]);
  8.                 exit(0);
  9.         }

  10.         for (i = 1; i < argc; i++) {
  11.                 printf("%s: ", argv[i]);
  12.                 w = atoi(argv[i]);

  13.                 for (k = 0; w > 0 || (w%7 && w%5); k++)
  14.                         w -= 12;

  15.                 if (w == 0)
  16.                         printf("(12)*%d\n", k);
  17.                 else if (w%7 == 0) {
  18.                         q = w/7 >= 0 ? w/7 : -w/7;
  19.                         if (q > k)
  20.                                 printf("(-7)*%d + (5)*%d\n", q-k, k);
  21.                         else if (q == k)
  22.                                 printf("(5)*%d\n", q);
  23.                         else
  24.                                 printf("(5)*%d + (12)*%d\n", q, k-q);
  25.                 }
  26.                 else if (w%5 == 0) {
  27.                         q = w/5 >= 0 ? w/5 : -w/5;
  28.                         if (q > k)
  29.                                 printf("(-5)*%d + (7)*%d\n", q-k, k);
  30.                         else if (q == k)
  31.                                 printf("(7)*%d\n", q);
  32.                         else
  33.                                 printf("(7)*%d + (12)*%d\n", q, k-q);
  34.                 }
  35.         }
  36. }
复制代码

论坛徽章:
0
64 [报告]
发表于 2010-08-20 19:16 |只看该作者
回复 63# shymn


    在W>0的情况下, 算法没问题,所以应该对负数判断一下,结果全部取反

论坛徽章:
0
65 [报告]
发表于 2010-08-20 19:18 |只看该作者
回复 63# shymn


    就算法来说,已经很不错了

论坛徽章:
0
66 [报告]
发表于 2010-08-20 19:22 |只看该作者
回复 65# chong232


    谢谢,总算有人回我了,那个问题里面w是正数,所以我就没考虑w为负数的情况了

论坛徽章:
0
67 [报告]
发表于 2010-08-20 19:26 |只看该作者
回复 66# shymn


    呵呵,我是针对你的公式说的

论坛徽章:
0
68 [报告]
发表于 2010-08-20 19:34 |只看该作者
本帖最后由 shymn 于 2010-08-20 19:42 编辑

回复 67# chong232


    那样的话,如果w一开始就是负数,应该是要迭代地加上12,再把后面的负号变正号,正变负对吗?

论坛徽章:
0
69 [报告]
发表于 2010-08-20 21:41 |只看该作者
一个整数规划问题,很直观啊.用lindo解决.

论坛徽章:
0
70 [报告]
发表于 2010-08-20 21:51 |只看该作者
我给个解法:
6种木块(12,-12,+7,-7,+5,-5),数量任意,假设背包大小W=N
为了用最小的块数填充,于是从 ...
feuerchop 发表于 2010-08-18 20:09



    我也是用这种取余数的方法,我是用PYTHON写的,没用循环,速度很快。   
思路是:
            12a+7b+5c=w
             先取12的余数,或者先取7的余数,或者先取5的余数,这样有6种[a,b,c]的list
             然后从list中取出其中|a|+|b|+|c|最小的那个list就是所要求的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP