求助排列组合问题

feelang 2009-05-23 01:07:19
m个组参加竞赛,n个评委进行论文评审,每组论文均要给3位评委评审,当m,n满足什么条件时能够保证任意两个组不出现有2位评委一样的情况?
...全文
266 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiuzhenguang 2009-08-21
  • 打赏
  • 举报
回复
其实5楼得到的结果并不对,因为手算可以得出当评委为10人时,可以分出13组两两不重合的分组来,如下所示:
0,1,2
3,0,4
5,0,6
7,0,8
9,1,3
2,3,5
4,1,5
6,1,7
8,2,4
9,2,6
7,4,9
8,3,6
5,8,9
Edison1986 2009-05-23
  • 打赏
  • 举报
回复
沙发............
acdbxzyw 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sunnyplain 的回复:]
如果是是完全随机来选的话,只有在m=1的时候才能以概率1保证上述结论
[/Quote]

完全随机那就没答案了。
能保证就行。
acdbxzyw 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bottlebox 的回复:]
没看懂楼上,感觉结果不大对劲,我这样考虑:
n个评委考虑为空间有n个点,3个评委审一篇论文,即把n个点三个为一组进行分组,一个组为一个三角形。因为不能有2个评委同时审任两篇论文的情况,即任一个三角形不能有相同的边,总边数为C(n,2)=n*(n-1)/2,这些边能组成的不重边的三角形个数为C(n,2)/3,也就是说n个评委不能审阅超过C(n,2)/3的论文。
所以有m <=C(n,2)/3
[/Quote]

这是错的。
随便举例。当m=2时,n=4. 不能分配。
ThirstyCrow 2009-05-23
  • 打赏
  • 举报
回复
5楼公式有误,重新推导的公式如下。推导方法是将5楼的d(n)列数据累加,lz也可以自己推一下。

m(n) = sum(2^(i-2)(2^(i-1)-1), i=2..u) + v(v+1)/2
其中,u = floor(log2(n)), v = n - 2^u.


这个公式是根据计算结果推导出来的,没有理论证明。
程序的思路跟7楼说的基本相同,即通过不断从n个顶点的全图中,不断取出周长为3的回路(将回路的边从图中移除),从而求出最大分组数。lz可以根据这种思路,自己尝试证明。
瓶盒 2009-05-23
  • 打赏
  • 举报
回复
没看懂楼上,感觉结果不大对劲,我这样考虑:
n个评委考虑为空间有n个点,3个评委审一篇论文,即把n个点三个为一组进行分组,一个组为一个三角形。因为不能有2个评委同时审任两篇论文的情况,即任一个三角形不能有相同的边,总边数为C(n,2)=n*(n-1)/2,这些边能组成的不重边的三角形个数为C(n,2)/3,也就是说n个评委不能审阅超过C(n,2)/3的论文。
所以有m<=C(n,2)/3
feelang 2009-05-23
  • 打赏
  • 举报
回复
感谢楼上几位的回答,补充说明一点,需要数学公式,不需要代码。
ThirstyCrow 2009-05-23
  • 打赏
  • 举报
回复
根据计算可得出如下经验公式:
m(n) = sum(2^(i-2)(2^(i-1)-1), i=2..u) + v(v-1)/2
其中,u = floor(log2(n)) + 1, v = n + 1 - 2^u.

n : number of judges
m(n): max number of teams
d(n): m(n) - m(n - 1)
e(n): number of edges of a n-vertex complete graph
f(n): e(n) - 3m(n)

n m(n) e(n) d(n) f(n)
3 1 3 1 0
4 1 6 0 3
5 2 10 1 4
6 4 15 2 3
7 7 21 3 0
8 7 28 0 7
9 8 36 1 12
10 10 45 2 15
11 13 55 3 16
12 17 66 4 15
13 22 78 5 12
14 28 91 6 7
15 35 105 7 0
16 35 120 0 15
17 36 136 1 28
18 38 153 2 39
19 41 171 3 48
20 45 190 4 55
21 50 210 5 60
22 56 231 6 63
23 63 253 7 64
24 71 276 8 63
25 80 300 9 60
26 90 325 10 55
27 101 351 11 48
28 113 378 12 39
29 126 406 13 28
30 140 435 14 15
31 155 465 15 0
ThirstyCrow 2009-05-23
  • 打赏
  • 举报
回复
public class Problem {

public static void solve(int n) {
int[] edge = new int[n * (n - 1) / 2];
int ei = 1;
int m = 0;
for (int va = 2; va < n; va++) {
int base = 0;
for (int vb = 1; vb < va; vb++) {
for (int vc = 0; vc < vb; vc++) {
int ebc = base + vc;
int eac = ei + vc;
if (edge[ebc] == 0 && edge[eac] == 0) {
edge[ebc] = edge[eac] = edge[ei + vb] = 1;
m++;
System.out.printf("%d, %d, %d\n", vc, vb, va);
break;
}
}
base += vb;
}
ei += va;
}
System.out.printf("When n = %d, m must be less than or equal to %d.\n", n, m);
}

public static void main(String[] args) {
Problem.solve(9);
}
}


Output:
0, 1, 2
0, 3, 4
1, 3, 5
2, 4, 5
2, 3, 6
1, 4, 6
0, 5, 6
0, 7, 8
When n = 9, m must be less than or equal to 8.
sunnyplain 2009-05-23
  • 打赏
  • 举报
回复
如果是是完全随机来选的话,只有在m=1的时候才能以概率1保证上述结论
acdbxzyw 2009-05-23
  • 打赏
  • 举报
回复
n >= 2*m+1 ?
数学不太好。。。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧