如何在子集中找到元素的总和

时间:2019-01-20 19:27:30

标签: java

我想找到其元素可被2整除或元素之和可被2整除的子集的数量

我找到了给定数组的所有可能子集

for(int i=1;i<=(Math.pow(2,n));i++) //Loop for all 2^n combinations
    {
    for(int j=0;j<n;j++)
        {
            if((i&(1<<j))>0) //This gives the subset of the array

输入:1 2 3 输出:3个为{2},{1,3 = 4},{1,2,3 = 6}的子集可以被2整除或者其元素之和可以被2整除。

1 个答案:

答案 0 :(得分:1)

在假定条件下,

  • 输入为n(自然数)
  • 输出是“偶数子集”(以大小为n的自然数的序列)的计数

...(准确的)结果是:

sum(binomial(n - 1, k), k in [1 .. n - 1])

分别(=):

floor(sum(binomial(n, k), k in [1 .. n])/2)

分别(=):

(2^(n-1)) -1


O(log(n))算法:

public class Test {


    public static long countSuperClever(int n) {
        return pow(2L, (long) n - 1) - 1L;
    }

    // best thx to https://codingforspeed.com/using-faster-integer-power-in-java/
    private static long pow(long a, long b) {
        long re = 1L;
        while (b > 0) {
            if ((b & 1) == 1) {
                re *= a;
            }
            b >>= 1;
            a *= a;
        }
        return re;
    }

    public static void main(String[] args) {
        for (int i = 3; i < 12; i++) {
            System.out.println(countSuperClever(i));
        }
    }

}

另请参阅:https://math.stackexchange.com/a/1338830/20447