找回密码
 欢迎注册
楼主: mathe

[讨论] 毒酒问题(加强版)

  [复制链接]
 楼主| 发表于 2018-3-18 06:50:38 | 显示全部楼层
11人31瓶:
400 40b 415 452 464 622 506 4b0 48c 618 528 4c1 701 63 a9 125 5c 96 20e 11a 245 149 283 191 268 170 1a2 2a4 342 2d0 1c4
400 40d 413 468 50a 618 446 530 4a2 494 624 641 581 39 63 a5 5c 9a 20e 116 c9 151 305 283 2a8 164 322 348 1c2 2c4 390
400 413 40d 4a1 494 618 470 446 622 48a 524 701 548 39 115 11a 216 5c a6 6a 22c 291 143 189 c5 261 330 382 344 1e0 2c8
400 413 40d 506 628 530 614 44a 4a2 464 498 641 581 125 231 63 a9 12a 226 56 8e 78 b4 309 283 151 c5 342 384 1c8 2d0
400 419 426 470 621 505 492 48c 614 60a 528 4c1 542 3a 63 4e 10b 134 151 245 d4 e8 258 289 1a1 198 2a4 186 30c 2c2 360
400 425 41a 470 48c 606 514 4a2 611 628 509 4c1 542 2b 4e 53 107 138 d4 264 e8 249 161 285 1a4 30c 298 191 18a 2c2 350
400 451 40d 483 621 468 542 498 606 584 530 4b c5 119 a9 213 123 305 35 24c 1c8 262 56 350 164 28a 10e 238 192 a6 294
400 454 419 423 44a 605 4a4 506 4c1 612 528 47 2d 72 264 20e cc 96 134 161 b1 238 158 aa 311 283 189 2d0 322 1c2 384 (66#的解)
400 464 41c 429 44a 486 605 491 541 622 512 47 71 1b d4 234 14c 115 126 20e e8 138 b2 252 298 360 2a1 189 1c2 303 384
400 470 41c 42a 413 609 644 4a1 542 505 486 59 2d 4e b8 231 262 154 161 d2 10b 207 348 28a 294 324 2c1 312 18c 191 1a2
400 470 41c 42a 413 609 644 4a1 542 505 486 59 2d 4e b8 231 262 154 161 d2 10b 207 348 28a 294 324 2c1 312 18c 191 1a2
400 50c 624 470 498 611 521 512 60a 449 485 446 4a2 17 2b 5c ac 119 20d b1 65 322 252 186 ca 143 283 344 388 1d0 2e0
400 50c 624 470 498 611 521 512 60a 449 485 446 4a2 17 2b 5c ac 119 20d b1 65 322 252 186 ca 143 283 344 388 1d0 2e0
400 605 60a 458 491 4a4 544 522 588 443 429 416 251 321 292 318 342 384 226 289 1b0 72 e1 d4 168 3c 115 ca 183 4d 10e
400 605 60a 521 4c4 514 4a8 492 548 419 443 426 251 264 238 322 2c2 216 309 28c f0 152 1a4 198 33 6a 145 c9 183 2d 10e
400 605 60a 521 4c4 514 4a8 492 548 419 443 426 251 264 238 322 2c2 216 309 28c f0 152 1a4 198 33 6a 145 c9 183 2d 10e
400 605 60a 541 4a4 514 528 492 4c8 423 419 446 231 264 258 2a2 342 216 309 28c f0 132 1c4 198 53 6a 125 95 183 4d 10e
400 605 60a 541 4a4 514 528 492 4c8 423 419 446 231 264 258 2a2 342 216 309 28c f0 132 1c4 198 53 6a 125 95 183 4d 10e
400 624 603 544 588 521 491 452 41c 486 449 42a 341 382 294 258 2a8 231 262 30c 1d0 138 74 e1 b2 185 126 14a 113 2d 8b
400 628 4d0 612 704 581 419 4a4 542 423 445 40e 318 1e0 291 249 321 28a 2c4 262 234 a9 71 9c 12a 5a 6c 154 10d 186 207
400 628 4d0 702 614 581 419 4a2 544 443 425 40e 318 1e0 291 249 321 2c2 28c 232 264 a9 9a b4 6a 152 12c 5c 10b 186 207
400 630 5c0 609 642 48a 50c 511 464 485 423 416 198 21c 251 381 344 292 2a4 322 c9 3a 161 b1 d4 e2 134 2d 10b 4e 207
400 630 5c0 609 642 48a 50c 521 454 485 413 426 1a8 22c 261 381 344 294 2a2 312 c9 3a 151 b1 d2 162 134 1d 10b 4e 207
400 630 5c0 609 642 48a 50c 521 454 485 413 426 298 78 1a8 22c 261 381 344 2a2 312 151 b1 d2 e4 162 134 1d 10b 4e 207
400 642 60c 511 4a4 582 458 528 489 423 445 416 3a0 350 298 2c4 268 283 215 309 306 b1 1c1 d2 74 162 125 3a 14c 4b 8e
400 708 606 4c8 521 452 514 4a4 419 42a 445 483 3a0 251 234 289 24c 21a 305 223 170 198 1c1 d4 b2 69 14a 12c 113 186 f
400 708 606 4c8 521 452 514 4a4 419 42a 445 483 3a0 251 234 289 24c 21a 305 223 170 198 1c1 d4 b2 69 14a 12c 113 186 f
400 708 606 4c8 521 452 514 4a4 419 42a 445 483 3a0 251 2c2 234 24c 21a 305 223 170 198 1c1 d4 b2 69 14a 12c 113 186 f
400 720 4a1 432 542 584 611 449 48a 60c 454 407 1a8 238 350 d8 2a2 264 71 6a b4 1c1 289 192 14c 123 2d 243 306 115 1e
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2018-3-17 19:35:21 | 显示全部楼层
10个人22瓶毒酒的一些本质不同的方案,每个数据表示为16进制数(需要将它们转化为10比特的二进制数)
1 2 300 a0 50 c 2c8 234 1c4 138 285 229 21a 246 18a 115 149 126 99 96 65 6a
1 2 300 b1 8e 72 4d 1a2 185 289 292 261 246 151 14a 129 22a 215 116 3c0 324 318
1 2 30 c 328 298 e4 154 24c 18c 2a2 311 161 d2 225 216 6a 59 126 95 a9 11a
1 2 30 c 328 314 e4 d8 24c 18c 2a1 292 162 151 226 219 69 56 aa 95 125 11a
2 1 24 18 c0 3c0 aa 71 56 8d 232 229 10e 115 162 1a1 286 245 192 149 24a 291
2 1 24 18 c0 3c0 b2 71 4e 8d 12a 229 216 115 262 1a1 186 245 28a 149 152 291
2 1 24 18 e4 318 162 261 286 185 24a 151 192 289 aa b1 232 129 56 4d 10e 215
2 1 24 18 e4 318 162 2a1 286 145 24a 189 192 251 232 131 aa 69 10e 20d 56 95
2 1 30 c 24c 18c 322 2a1 d2 151 28a 305 146 c9 216 219 6a 65 11a 95 a6 129
2 1 30 c 24c 18c 322 311 d2 e1 286 289 14a 145 21a 225 66 59 aa 95 116 129
2 1 30 c c0 158 2a8 254 1a4 3c0 6a 99 96 65 21a 129 226 115 18a 249 146 285
2 1 30 c c0 168 298 254 1a4 3c0 aa 59 96 65 11a 229 226 115 24a 189 146 285
2 1 30 c c0 268 198 254 1a4 3c0 5a a9 96 65 12a 219 226 115 28a 149 146 285

但是程序没有搜索到66#的解,那个解标准化后为 200 41 21 14 a 111 106 a4 1c0 128 219 303 2d0 226 344 2a8 93 f 56 3a 198 cc
而将这个解作为输入,还可以搜索出更多的解,比如
200 22 11 c 225 21a 2a8 249 283 254 384 342 17 129 b4 78 11c 145 18a d2 1e0
200 223 251 305 289 30a 2c2 294 238 264 113 87 2d 149 1e b2 146 6a 134 1d0 1a8
200 303 291 225 249 30c 286 21a 270 1c1 131 2b 47 8d 162 1a4 198 d2 36 e8 5c
200 381 28a 262 324 254 20d 213 1a8 1d0 39 c9 5a 14c 132 b4 65 143 115 2e c6
200 381 30a 2c4 262 234 20d 213 1c8 b8 129 151 5c d2 132 164 4b a3 95 2e 186
但是最终还是回到上面的那些解中,看来我的这个方法偏向于前面的那些解

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2018-3-17 08:19:18 来自手机 | 显示全部楼层
9人的最优结果在127#的程序中可以较快找到,但是10人情况复杂度大增,现在估计至少需要数千年机时才有可能穷举。所以对于超过10人的情况,我们很难穷举。不过我现在用随机算法找出不同的22瓶方案了

点评

根据65#的姿态,我们不妨展望这串数: 3, 4, 5, 6, 8, 10, 13, 16, 20, 25, 32, 40, 51, 64, 81, 102, 128, 161, 203, 256, 323, 406, 512, 645, 813, 1024....也就是说:1000瓶酒,27个人是可以的。  发表于 2018-3-17 09:47
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-3-17 08:10:40 | 显示全部楼层
mathe 发表于 2018-3-1 10:42
9个人的问题,我开始使用BLISS库来过滤重复的搜索,但是后来发现BLISS库有严重的内存泄漏问题
后来改成使 ...

敬佩楼主对此题倾注了不少的心力。
我们不妨先来约定几条,问题也许会简单些:
1,从左到右:”1“出现少的排前面。
2,从上到下:”1“出现少的排前面
3,从上到下:”1“出现相同时,按从小到大排列。
     譬如:a(10) >= 22(修改).
1,从左到右:按”1“出现6,7,8的排列。
2,从上到下:按”1“出现1,2,3,4的排列
3,从上到下:”1“出现相同时,按从小到大排列。
原则是:如果把22瓶酒换成十进制数,总和尽可能小。
a(10) >= 22.
   1,1010110000
   2,1110000000
   3,0010011000
   4,0110100001
   5,1000010101
   6,0011000101
   7,1001000000
   8,0000000010
   9,0001110100
10,0001001000
11,0010101010
12,1100010010
13,0000010001
14,0000101101
15,0100010100
16,0000011110
17,0100101000
18,0001100011
19,0000100100
20,0101000001
21,0101000110
22,1010000011
a(10) >= 22(修改).
   8,0000010000
13,0000000011
10,0000100100
19,0001001000
   7,0100000100
20,0010000101
15,0010001010
17,0011100000
   3,1000100010
   2,1110000000
16,0000111010
   9,0001001110
18,0001010101
14,0001101001
21,0010011100
   5,0100001011
   1,0100100110
12,0110010010
   6,1000001101
11,1001110000
   4,1011000001
22,1100010001
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-3-14 10:35:11 | 显示全部楼层
mathe 发表于 2018-3-1 10:42
9个人的问题,我开始使用BLISS库来过滤重复的搜索,但是后来发现BLISS库有严重的内存泄漏问题
后来改成使 ...

66#的方法应该是最好的,可惜只给到12,若能再来3个(1个也好),是不是我们的信息太封闭了?

点评

66#已经有链接了,能搜索到的信息就这么多。 而127#的代码对于10个人估计至少要计算上千年,所以不可行。 我试着随机搜索了一下,可以找出上千个10人21瓶毒酒的结果,但是没有找到22的情况  发表于 2018-3-15 18:49
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-3-5 18:36:08 | 显示全部楼层
mathe 发表于 2018-3-1 10:42
9个人的问题,我开始使用BLISS库来过滤重复的搜索,但是后来发现BLISS库有严重的内存泄漏问题
后来改成使 ...

一年来粘着”‘数学研发论坛’“这座宝库!收获真是不少!
66#的方法应该是最好的,可惜只给到12,若能给到15(再来3个),.....
请网友搜索给个链接,感谢不尽!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2018-3-1 10:42:50 | 显示全部楼层
9个人的问题,我开始使用BLISS库来过滤重复的搜索,但是后来发现BLISS库有严重的内存泄漏问题
后来改成使用nauty库: http://pallini.di.uniroma1.it/
这个库编译以后可以有多个不同版本,比如 nauty.a nautyL.a nautyL1.a nautyW.a 等
对于人数比较少时,如果人的数目加酒的数目不超过64,可以使用nautyL1.a会有比较好的效率
下面代码可以完成这个穷举工作,其中K=8(8个人)的代码很快可以运行完,但是9个人就需要运行1天多了
而10个人估计就要很长时间了。
代码会输出一些中间结果,如果将那些中间结果作为输入,代码可以自动从这些中间结果处继续开始
  1. #include <set>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <map>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #define MAXN 64
  9. #include "nauty/nauty.h"

  10. typedef unsigned int dtype;
  11. typedef std::set<dtype> UnionState;
  12. typedef std::vector<dtype> DataState;
  13. int bestn;
  14. #define UB   65
  15. #ifndef K
  16. #define K    9
  17. #endif
  18. #if K==8
  19. #define HK 3
  20. #define DUMP_RANGE 12
  21. #endif
  22. #if K == 9
  23. #define HK   4
  24. #define DUMP_RANGE 16
  25. #endif
  26. #if K == 10
  27. #define HK  5
  28. #define DUMP_RANGE 20
  29. #endif

  30. typedef struct _TGRAPH{
  31.     graph data[MAXN];
  32.     bool operator<(const struct _TGRAPH& g)const{
  33.          int i;
  34.          for(i=0;i<MAXN;i++){
  35.             if(data[i]<g.data[i])return true;
  36.             if(data[i]>g.data[i])return false;
  37.          }
  38.          return false;
  39.     }
  40.     bool operator==(const struct _TGRAPH& g)const{
  41.          int i;
  42.          for(i=0;i<MAXN;i++){
  43.             if(data[i]!=g.data[i])return false;
  44.          }
  45.          return true;
  46.     }
  47.     _TGRAPH(){memset(data,0,sizeof(data));}
  48.     _TGRAPH(const graph g[MAXN]){memcpy(data,g,sizeof(data));}
  49. }TGRAPH;

  50. int compg(const void *p, const void *q)
  51. {
  52.     const TGRAPH *g1=(const TGRAPH *)p;
  53.     const TGRAPH *g2=(const TGRAPH *)q;
  54.     int i;
  55.     for(i=0;i<MAXN;i++){
  56.        if(g1->data[i]<g2->data[i])return -1;
  57.        if(g1->data[i]>g2->data[i])return 1;
  58.     }
  59.     return 0;
  60. }

  61. UnionState us[UB];
  62. DataState ds;
  63. int curlevel;
  64. int curbest;
  65. #define tus us[curlevel]
  66. graph allg[UB][MAXN];
  67. graph normg[UB][MAXN];
  68. std::set<TGRAPH> usedg[UB];

  69. void graph_remove_node(graph g[MAXN], graph ng[MAXN], int node, int n)
  70. {
  71.     int i;
  72.     graph lm,rm;
  73.     if(node>0){
  74.         memcpy(ng, g, sizeof(g[0])*node);
  75.     }
  76.     if(node<n-1){
  77.         memcpy(&ng[node],&g[node+1], sizeof(g[0])*(n-1-node));
  78.     }
  79.     memset(&ng[n-1], 0, sizeof(g[0])*(MAXN-n+1));
  80.     if(node == 0){
  81.        for(i=0;i<n-1;i++){
  82.           ng[i]<<=1;
  83.        }
  84.     }else{
  85.        lm=(1ULL<<node)-1;
  86.        lm<<=64-node;
  87.        rm=(1ULL<<(63-node))-1;
  88.        for(i=0;i<n-1;i++){
  89.           graph h=ng[i];
  90.           ng[i] = (h&lm)|((h&rm)<<1);
  91.        }
  92.     }
  93. }

  94. void dump_normalized(graph g[MAXN],graph ng[MAXN], int orbits[MAXN], int n)
  95. {
  96.     int i,j,e;
  97.     int lab[MAXN], ptn[MAXN];
  98.     static DEFAULTOPTIONS_GRAPH(options);
  99.     statsblk stats;
  100.     int m,v;
  101.     memset(ng,0,sizeof(ng[0])*MAXN);

  102.     m=SETWORDSNEEDED(n);
  103.     nauty_check(WORDSIZE,m,n,NAUTYVERSIONID);
  104.     options.getcanon = TRUE;
  105.     options.defaultptn = FALSE;
  106.     for(i=0;i<n;++i){
  107.       lab[i]=i;
  108.     }
  109.     for(i=0;i<n;++i){
  110.       ptn[i]=1;
  111.     }
  112.     ptn[K-1]=0;
  113.     ptn[n-1]=0;
  114.     densenauty(g, lab, ptn, orbits, &options, &stats, m, n, ng);
  115. }

  116. void init()
  117. {
  118.     curlevel = 0;
  119.     ds.clear();
  120.     us[0].clear();
  121. }
  122. int bitcount(dtype d);
  123. int test_add(dtype d)
  124. {
  125.     UnionState ls;
  126.     if(bitcount(d)>HK)return -1;
  127. #ifdef STRICT
  128.     if(tus.find(d)!=tus.end()){
  129.          return -1;
  130.     }
  131.     ls.insert(d);
  132. #endif
  133.     int i;
  134.     for(i=0;i<ds.size();++i){
  135.         if(ds[i]==d)return -1;
  136.         dtype u=d|ds[i];
  137.         if(tus.find(u)!=tus.end()){
  138.             return -1;
  139.         }
  140.         if(ls.find(u)!=ls.end()){
  141.            return -1;
  142.         }
  143.         ls.insert(u);
  144.     }
  145.     return 0;
  146. }

  147. int bitcount(dtype d){
  148.     int i,b=0;
  149.     for(i=0;i<K;i++){
  150.        if(d&(1<<i))b++;
  151.     }
  152.     return b;
  153. }

  154. void do_add(dtype d){
  155.     int i;
  156. #ifdef STRICT
  157.     tus.insert(d);
  158. #endif
  159.     for(i=0;i<ds.size();++i){
  160.         dtype u=d|ds[i];
  161.         tus.insert(u);
  162.     }
  163.     ds.push_back(d);
  164. }

  165. void pop()
  166. {
  167.    ds.pop_back();
  168.    curlevel--;
  169. }


  170. void dumpg(int n, int is_best)
  171. {
  172.     int i;
  173.     if(is_best){
  174.        printf("Best edge %d\n\t",n-K);
  175.     }else{
  176.        printf("More edge %d\n\t",n-K);
  177.     }
  178.     for(i=K;i<n;i++){
  179.        printf("%llx ",allg[curlevel][i]>>(64-K));
  180.     }
  181.     printf("\n");
  182.     fflush(stdout);
  183. }

  184. FILE *fout;
  185. void search(int n, dtype initvalue[UB], int nextstep, int& maxstep)
  186. {
  187.     int i,j;
  188.     int orbits[MAXN],orbits2[MAXN];
  189.     usedg[curlevel].clear();
  190.     graph g[MAXN], ng[MAXN];
  191.     memset(g,0,sizeof(g));
  192.     memset(ng,0,sizeof(ng));
  193.     if(bestn<n-1){
  194.         bestn=n-1;
  195.         dumpg(bestn,1);
  196.     }else if(n-1>=DUMP_RANGE+K){
  197.         dumpg(n-1, 0);
  198.     }
  199.     for(i=1;i<1<<K;++i){
  200.        if(test_add(i)==0){
  201.            memcpy(allg[curlevel+1],allg[curlevel],sizeof(allg[0]));
  202.            for(j=0;j<K;j++){
  203.               if(i&(1<<j)){
  204.                  ADDONEEDGE(allg[curlevel+1],K-1-j,n-1,1);
  205.               }
  206.            }
  207.            dump_normalized(allg[curlevel+1],normg[curlevel+1],orbits,n);
  208.            TGRAPH t(normg[curlevel+1]);
  209.            if(usedg[curlevel].find(t)!=usedg[curlevel].end()){
  210.                continue;
  211.            }
  212.            for(j=K;j<n-1;j++){
  213.               if(orbits[j]==j && orbits[n-1]!=j){
  214.                   graph_remove_node(allg[curlevel+1], g, j, n);
  215.                   dump_normalized(g, ng, orbits2, n-1);
  216.                   int c=compg(ng, normg[curlevel]);
  217.                   if(c<0)break;
  218.               }
  219.            }
  220.            if(j<n-1)continue;
  221.            usedg[curlevel].insert(t);
  222.            if(maxstep>0){
  223.                if(allg[curlevel+1][K+nextstep]>>(64-K) != initvalue[nextstep]){
  224.                   continue;
  225.                }
  226.            }
  227.            us[curlevel+1]=us[curlevel];
  228.            curlevel++;
  229.            do_add(i);
  230.            if(nextstep+1==maxstep)maxstep=0;
  231.            search(n+1, initvalue, nextstep+1, maxstep);
  232.            pop();
  233.        }
  234.     }
  235. }

  236. int main(int argc, const char *argv[])
  237. {
  238.     int i,j,n;
  239.     int cc=argc-1;
  240.     dtype initvalue[UB];
  241.     for(i=1;i<argc;i++){
  242.          char *endp=NULL;
  243.          initvalue[i-1]=strtol(argv[i],&endp, 16);
  244.     }
  245.     int orbits[MAXN];
  246.     if(cc>=1){
  247.         dtype r=0;
  248.         for(j=K-1;j>=0;j--){
  249.            if((initvalue[0]&(1<<j))==0)break;
  250.            r|=1<<j;
  251.         }
  252.         if(r!=initvalue[0]||r==0){
  253.            fprintf(stderr,"Invalid start value\n");
  254.            return -1;
  255.         }
  256.         if(cc==1)cc=0;
  257.     }else{
  258.         j=K-2;
  259.         cc=0;
  260.     }
  261.     for(i=K-1-j;i<=HK;i++){
  262.         fprintf(stderr, "searh for i=%d\n",i);
  263.         dtype d=0;
  264.         n=K+1;
  265.         EMPTYGRAPH(allg[0],1,n);
  266.         for(j=0;j<i;j++){
  267.             ADDONEEDGE(allg[0], j, K, 1);
  268.         }
  269.         init();
  270.         dump_normalized(allg[0], normg[0], orbits, n);
  271.         d=allg[0][K]>>(64-K);
  272.         do_add(d);
  273.         search(n+1, initvalue, 1, cc);
  274.     }
  275.     return 0;
  276. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-2-28 12:37:37 | 显示全部楼层
本帖最后由 王守恩 于 2018-2-28 18:52 编辑
王守恩 发表于 2018-2-26 15:25
谢谢mathe!此题让我长进不少!
总算把题目的来龙去脉搞清楚了!
124楼的解法还是没有问题!我还是想再 ...

我来把题目改一下,题意不变:
每个开关有2个功能:开或者关。每盏灯只有2种状况:亮或者不亮。
问:用n个开关,最多能控制m盏灯,恰好让其中的任意2盏灯亮起来?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-2-26 15:25:12 | 显示全部楼层
mathe 发表于 2018-2-20 16:31
9个人最多只能识别17瓶正好包好两瓶毒酒的方案,而且本质上只有一种方案:
G HI EF AB DEI CFI ADH BCH AC ...

谢谢mathe!此题让我长进不少!
总算把题目的来龙去脉搞清楚了!
124楼的解法还是没有问题!我还是想再往前推一推!
谢谢mathe!能否把66楼的资料多给一些!

点评

谢谢mathe!  发表于 2018-3-1 11:20
66#有链接,内容就是从那里复制的,我也没有更多信息,不知道他是怎么找到的。  发表于 2018-3-1 10:32
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-2-24 19:06:45 | 显示全部楼层
本帖最后由 王守恩 于 2018-2-24 19:08 编辑
mathe 发表于 2018-2-20 16:31
9个人最多只能识别17瓶正好包好两瓶毒酒的方案,而且本质上只有一种方案:
G HI EF AB DEI CFI ADH BCH AC ...

n个人,最多只能识别m瓶正好包含两瓶毒酒的方案,等同下面的题目:
n个连续正整数(从“1”开始),最多只能组成(m - 1)个组合数。组合数算法规定2条:
1,每个组合数取n个连续正整数中的若干个(1个——n个)作加数,用“+”连接而成;
2,比较任意2个组合数,不允许有1个组合数的加数包含了另1个组合数的所有加数。
譬如:
n=2,m  - 1=2    组合数=1,2
n=3,m  - 1=3    组合数=1,2,3
n=4,m  - 1=4    组合数=1,2,3,4
n=5,m  - 1=5    组合数=1+2,1+5,2+3,3+4,4+5
n=6,m  - 1=7    组合数=1+5,2+3,4+6,1+2+6,1+3+4,2+4+5,3=5+6
n=7,m  - 1=9    组合数=1+2,1+3,1+4,2+5,3+6,4+7,2+6+7,3+5+7,4+5+6
n=8,m  - 1=12    组合数=1+2,3+4,5+8,6+7,1+3+5,1+4+7,1+6+8,2+3+6,2+4+8,2+5+7,3+7+8,4+5+6
n=9,m  - 1=16    组合数=1+2,1+8,3+6,4+7,5+9,1+3+4,1+5+7,1+8+9,2+3+5,2+4+9,2+6+7,3+7+8,3+7+9,4+5+6,4+5+8
n=10,m  - 1=19    组合数=1+2,4+7,5+9,1+3+4,1+5+7,1+8+9,2+3+5,2+4+9,2+6+7,3+4+6,3+7+8,4+5+6,4+5+8,1+5+6+10,
                                          1+7+8+10,2+4+8+10,2+6+9+10,3+4+9+10,3+5+7+10
...........


补充内容 (2018-2-25 10:28):
n个连续正整数(从“1”开始)=喝酒的人数,最多只能组成(m - 1)个组合数=酒的瓶数。每个组合数代码=每瓶酒对应喝酒人的编号。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-5 17:49 , Processed in 0.045756 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表