我知道有很多类似的问题,我已经阅读了几个小时。但它们似乎都不符合我的要求。
我的问题:
给出n个int数组,每个数组都有
形式array_i[] = {0, 1,...,count_i-1}, i = 0,1,...,n-1.
我们选择每个数组的一个数字来组合,这种组合的数量是
count_0*count_1*...*count_{n-1}
例如
array_0 = {0,1}
array_1 = {0,1,2}
array_2 = {0,1}
2 * 3 * 2 = 12种组合
0| 0 0 0
1| 0 0 1
2| 0 1 0
3| 0 1 1
4| 0 2 0
5| 0 2 1
6| 1 0 0
7| 1 0 1
8| 1 1 0
9| 1 1 1
10| 1 2 0
11| 1 2 1
我想得到第i个组合(例如第9个组合是{1,1,1}
)并且有效地获得它。我尝试过base-n转换的想法,就像这个Permutation for numbers in C。但它效率不高,因为基数必须是最大的count_i
,这可能是不必要的。我也想过为每个位使用不同的基数的想法,但是让关系正确是很棘手的。
任何建议都是值得欢迎的。
答案 0 :(得分:4)
与您的链接(Permutation for numbers in C)的主要区别在于49 ^ i成为count_j&#39的产品:
index_0 = ( i / sub_0 ) % count_0
index_1 = ( i / sub_1 ) % count_1
...
你预先计算的地方
sub_0 = count_1*count_2*...*count_{n-1}
sub_1 = count_2*count_3*...*count_{n-1}
...
在你的例子中,count = 2,3,2,我们有sub = 6,2,1,因此对于i = 9 index = 1,1,1