作者yauhh (哟)
看板Prob_Solve
标题Re: [问题] 数学的组合
时间Wed Feb 29 11:24:36 2012
※ 引述《chengchieh (cc)》之铭言:
: 其实只是要做C n 取 m 的功能
: 有一个array...长度为n
: 每次从中取出元素个数为m的array
: 预定的采用数值为C 13 取 5(标准的扑克牌手牌牌型查验~)
: 目前琐事有点多...脑袋不太灵光
: google的资料量太多...手边排不出时间来整理
: 不知道有没有人可以帮忙一下的...
: 感谢..
帮忙什麽事? 是帮忙告诉你怎麽做吗?
如果问题定位为n取m的全部都要取出,基本型就是
boolean Comb(set, n, m, result) {
if (m == 0) return true; //结果在result中.
if (n < 0) return false;
boolean found;
Element a = set.firstElement;
Set set1 = set.removeFirst();
found = Comb(set1, n-1, m, result);
Set result1 = result.add(a);
found = found & Comb(set1, n-1, m-1, result1);
}
呼叫这个程序,是用 Comb(set, set.length(), m, {}).
另外 "非递回" 的组合求法,就是像在一根杆子上移动一些串珠那样的求法.
先给一个阵列包含n个元素,元素内容是boolean,表示选取或不选取的状态.
一开始阵列左端m个元素设定为true.
为了方便说明,我们把false的元素说成是一个空的格子.
1. 将最右端连续空的格子消除: 也就是将最右边的连续空格子之右边的元素向左推,
结果是使最右边的连续false的右边找不到任何true.
2. 将最右边一个可以右移的格子向右移: 所谓可以右移,就是格子本身为true,并且
右边一格为false.
3. 记录目前true元素的状态: 此时标记为true的m个元素,是n取m的一种情况.
4. 如果不是最右边m个元素标记为true,则从第1步重新执行.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.66.119
1F:推 chengchieh:感谢... 02/29 14:25