我的问题是:对于给定的n, k
- 正整数和f
- 位掩码(k <= n, log(f) < n)
找到所有位掩码m,以便log(m) < n
和count_of_ones(m) == k
和{{ 1}}例如,如果我们有一个集合m & f = 0.
,则S={0,1,2,3,4}
的解决方案将代表n=5, k=2 and f=0b01010
的2元素组合。我目前的解决方案是找到S-{1,3}
的掩码(使用this算法),然后'拉伸'它们以符合我的条件:
n'=n-count_of_ones(f), k'=k and f'=0
如您所见,拉伸一个位掩码需要for(scaled_comb=comb; f > 0; f&=(f-1)) {
b = f&(-f);
scaled_comb = ((scaled_comb&~(b-1))<<1)|(scaled_comb&(b-1));
}
。有没有办法加快速度?谢谢;)