2012-07-11 21 views
0

我偶然发现了一个我正在寻找智能解决方案的问题。这基本上是一个组合问题。Devise Combinatorics命名约定

我有五个对象,其中我需要选择两个,我可以选择同一个两次,并且无论选择它们的顺序如何。这给我(5 + 2 - 1选择2)= 15个可能的组合。我现在想要将每个组合(即(1,1)或(2,5))减少到1到15之间的数字。有什么建议吗?

回答

3

准字典排序。按照字典顺序分配每个选择的位置,第二个分量不小于第一个。

(i,j) -> (15 - (7-i)*(6-i)/2) + (j - i) + 1 
+0

谢谢!认为那里可能有一个名字。 – foges 2012-07-12 00:54:37

1

假设你有一个组合(I,J)

不失一般性,说我< = j的

((7-i)+5)*(i-1)/2 + (j-i+1) 

你必须

(1,1) (1,2)→2(2,2)→6(3,3)→10(4,4)→13(5,5)→15

3)→7(3,4)→11(4,5)→14

(1,3) - > 3(2,4) - >图8(3,5) - > 12

(1,4) - > 4(2,5) - > 9

(1,5) - > 5

基本上,你首先必须列前组合数我,再加上(J-11 + 1)的行数

+0

你不能假设'我 DSM 2012-07-11 23:54:11

+0

@DSM但OP表示订单无关 – xvatar 2012-07-11 23:56:24

+0

该订单并不重要意味着您可以选择'i <= j',而不是'i DSM 2012-07-11 23:58:11