以前,同学给发了一个号称上海年薪30W的面试题的截图,其中有道国王试酒的问题用了大概一上午的时间给解出来了,那时还是只是解出来,不会有现有的知识把代码写出来,现在感觉水平可以了,所以就把这道题总结一下。
先把题发出来(原图找不到了,只能找一道类似的):
国王试酒问题解法

解题过程

这个图片一开始是我上海工作的同学发的一张图片,我一开始也没在意,随手就把它放在了我们的交流群里,然后就炸锅了,所以我也开始想怎么解。一开始我是没思路的,在我还在思考的时候有个同学说:用总人数除以24,得到的就是所需最少人数,这让我茅塞顿开,然后开始了我的解题之旅。一开始我思考如何像配药一样,把每一批的酒配成各种类似药方的东西,生成最少的配方,然后每个人一种就可以了,最后想了好久也没想到,不知道怎么就想到换了个思路,(注意,重点来了)让囚犯组合起来去尝酒。想到这一步,基本上就解出来了:找到合适的人数,然后对这些人取所有的组合数,说点人话:第一步:这些人中每个人对应一瓶酒;第二步:求这些人两两组合的所有情况,然后每种情况对应一瓶酒;…全部人对应一瓶酒,然后只要这些人对应酒的总数加起来多于每一批次的酒数就可以了,而这个合适的人数就是这些人的最少数目。额,我说的好像还不清楚,总之,剩下的这部分就是高中的组合数问题了。这样也可以用第一个思路去解释:每个囚犯最后喝的酒是配出来的。

代码

那时候刚工作嘛,对很多东西都不熟悉,所以那时候就没写出来,现在感觉进步了很多,所以再尝试下,发现也是很简单的:

// 求累乘
 function multiplication(n) {
     let res = 1, step = 1;
     if (n <= 1) {
         return 1;
     } else {
         return n * multiplication(n - 1);
     }
 }
 // 求组合数
 function combination(i, j) {
     let numerator = multiplication(j);
     let denominator = multiplication(i) * multiplication(j - i);
     let res = numerator / denominator;
     return res
 }
 function combinationAll(n) {
     if (n <= 1) {
         return 1;
     } else {
         let res = 0;
         for(let i = 1; i<= n; i++) {
             res += combination(i, n);
         }
         return res;
     }
 }
 let person = 1;
 while (combinationAll(person) * 24 < 400000)
 {
     person ++
 };
 console.log('需要的人数是:', person);

这就是我的代码,首先是使用递归函数求累乘,然后是把特定组合数写出来,再然后是求所有组合数,最下面那个就是计算结果了。通过上述代码我的答案是15。
另:代码还未优化,有些地方写得还不是很合适,以后用到要结合实际情况完善。

相关文章:

  • 2022-12-23
  • 2021-05-15
  • 2021-09-22
  • 2022-02-03
  • 2021-10-08
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-06-20
  • 2021-10-22
  • 2022-12-23
  • 2022-02-17
  • 2022-12-23
相关资源
相似解决方案