我得到了一个算法,其目的是给出整数数组中所有组合的所有可能总和。
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)
答案 0 :(得分:3)
让我们将N元素集的组合表示为N位数,其中如果j
项包含在组合中,则j
位为1,否则为0。这样,您可以将所有可能的组合表示为范围[0,2 N )中的数字。
外部循环迭代这些数字(1 << N
== 2 N )。
内部循环遍历集合的项目并if
条件检查j
项是否包含在当前组合中。换句话说,它会检查j
的{{1}}是否为1。
i
为您提供一个数字,其中1<<j
位为1,j
重置除该位以外的i & (1 << j)
的所有位,并i
检查结果不是0。
请注意,此代码(>
s)仅适用于N&lt; 31。