我偶然发现了一个我正在寻找智能解决方案的问题。这基本上是一个组合问题。
我有五个对象,我需要从中选择两个,我可以选择同一个对象两次,我选择它们的顺序无关紧要。这给了我(5 + 2 - 1 选择 2)= 15 种可能的组合。我现在想将每个组合(即 (1,1) 或 (2, 5))减少到 1 到 15 之间的数字。有什么建议吗?
我偶然发现了一个我正在寻找智能解决方案的问题。这基本上是一个组合问题。
我有五个对象,我需要从中选择两个,我可以选择同一个对象两次,我选择它们的顺序无关紧要。这给了我(5 + 2 - 1 选择 2)= 15 种可能的组合。我现在想将每个组合(即 (1,1) 或 (2, 5))减少到 1 到 15 之间的数字。有什么建议吗?
准字典顺序。为每个选择分配其在字典顺序中的位置,第二个组件不小于第一个组件。
(i,j) -> (15 - (7-i)*(6-i)/2) + (j - i) + 1
假设你有一个组合 (i, j)
不失一般性,说 i <= j
((7-i)+5)*(i-1)/2 + (j-i+1)
你会有
(1, 1)->1 (2, 2)->6 (3, 3)->10 (4, 4)->13 (5, 5)->15
(1, 2)->2 (2, 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
基本上,您将首先在第 i 列之前获得组合数,然后加上 (j-i+1) 作为行号