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

[讨论] 一个组合问题

[复制链接]
发表于 2018-4-26 11:38:14 | 显示全部楼层
计算机搜索有很多结果
0 1 4 11 29;0 2 8 17 22
0 1 4 11 29;0 2 21 26 35
0 1 13 31 38;0 2 8 17 22
0 1 13 31 38;0 2 21 26 35
0 1 15 19 25;0 2 5 13 34
0 1 15 19 25;0 2 9 30 38
0 1 15 19 25;0 3 11 32 39
0 1 17 23 27;0 2 5 13 34
0 1 17 23 27;0 2 9 30 38
0 1 17 23 27;0 3 11 32 39
0 2 8 17 22;0 3 10 28 40
0 2 21 26 35;0 3 10 28 40
我们可以以
0 1 4 11 29;0 2 8 17 22
为例子
上面对应两个模式,每个模式中每个数都可以加上0~40中任意一个数并且模41可以形成共82种模式。
这82个模式中,0~40每个数都正好在10个模式中出现。
于是我们把82个模式看成82个人,0~40看成41次会议,那么82个人可以召开41次会议,每次会议正好10个人,而没有两个人参加相同的会议
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-4-26 11:58:14 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAXV 41
  5. #define TSIZE 91390

  6. #define INVALID 0xFFFFFFFFFFFFFFFFLL
  7. unsigned data[TSIZE];
  8. signed long long result[TSIZE];
  9. int dc;
  10. signed long long alldiff(unsigned int x[5])
  11. {
  12.     signed long long r=0ll;
  13.     int i,j;
  14.     for(i=0;i<5;i++)for(j=i+1;j<5;j++){
  15.         long long l1 = 1ll<<(x[j]-x[i]);
  16.         if(r&l1)return INVALID;
  17.         r|=l1;
  18.         l1 = 1ll<<(MAXV-(x[j]-x[i]));
  19.         if(r&l1)return INVALID;
  20.         r|=l1;
  21.     }
  22.     return r;
  23. }

  24. void init()
  25. {
  26.     unsigned int i[5];
  27.     i[0]=0;
  28.     for(i[1]=i[0]+1;i[1]<MAXV;i[1]++){
  29.        for(i[2]=2*i[1]+1;i[2]<MAXV;i[2]++){
  30.            for(i[3]=i[2]+i[1]+1;i[3]<MAXV;i[3]++){
  31.                for(i[4]=i[3]+i[1]+1;i[4]<MAXV;i[4]++){
  32.                   signed long long r = alldiff(i);
  33.                   data[dc]=((i[1]<<24)|(i[2]<<16)|(i[3]<<8)|(i[4]<<0));
  34.                   result[dc]=r;
  35.                   dc++;
  36.                }
  37.            }
  38.        }
  39.     }
  40. }

  41. void output(unsigned x, unsigned y)
  42. {
  43.     printf("0 %d %d %d %d;", x>>24, (x>>16)&255, (x>>8)&255, x&255);
  44.     printf("0 %d %d %d %d\n",y>>24, (y>>16)&255, (y>>8)&255, y&255);
  45. }

  46. int main()
  47. {
  48.     int i,j;
  49.     init();
  50.     printf("dc=%d\n",dc);
  51.     for(i=0;i<dc;i++){
  52.       if(result[i]==INVALID)continue;
  53.       for(j=i+1;j<dc;j++){
  54.         if((result[i]&result[j]) == 0ll){
  55.             output(data[i],data[j]);
  56.         }
  57.       }
  58.     }
  59. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-4-26 12:15:48 | 显示全部楼层
本帖最后由 王守恩 于 2018-4-26 12:17 编辑
mathe 发表于 2018-4-26 11:38
计算机搜索有很多结果
0 1 4 11 29;0 2 8 17 22
0 1 4 11 29;0 2 21 26 35


我还是厚着脸皮问:A(82,18,10)=41应该有的,但 ,有A(8, ? ,3)=8吗?

补充内容 (2018-4-27 08:46):

谢谢mathe!谢谢宝贵的资料! A(82,18,10)=41是有的,A(8, ? ,3)=8也是有的。节点没有问题,前面有个路灯,心里踏实多了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2018-4-27 10:45:30 | 显示全部楼层
谢谢math老师,构造很巧妙。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-25 17:33 , Processed in 0.042199 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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