2

我有一个算法,其目标是在一个整数数组中给出所有组合的所有可能总和。

private void arraySumPermutation(int value ,int[] arr){
    int N = arr.length;     
    for(int i=0;i<1<<N;i++){
        int sum = 0;                
        for(int j=0;j<N;j++){       

            if((i & 1<<j)>0){
                iCount++;
                sum += arr[j];  
                //S.O.P(sum);
            }
        }

    }
}

我无法理解使用按位 AND 添加的内部 if 条件。内部 if 循环的目标是什么。

if((i & 1<<j)>0)
4

1 回答 1

4

让我们将 N 元素集合的组合表示为 N 位数,j如果组合中包含第一项,则第 1 位为 1 j,否则为 0。这样,您可以将所有可能的组合表示为 [0, 2 N ) 范围内的数字。

外部循环遍历这些数字(1 << N== 2 N)。

内部循环遍历集合中的项,if条件检查j项是否包含在当前组合中。换句话说,它检查jth 位i是否为 1。

1<<j给你一个只有jth 位为 1 的数字,i & (1 << j)重置i除该位之外的所有位,并>检查结果是否不为 0。

请注意,此代码(带ints)仅适用于 N < 31。

于 2013-01-14T08:00:32.550 回答