美文网首页lintcode程序员
730. 所有子集的和

730. 所有子集的和

作者: 和蔼的zhxing | 来源:发表于2018-01-24 21:19 被阅读11次

    给一整数 n, 我们需要求前n个自然数形成的集合的所有可能子集中所有元素的和
    样例

    给出 n = 2, 返回 6
    可能的子集为 {{1}, {2}, {1, 2}}. 
    子集的元素和为 1 + 2 + 1 + 2 = 6
    
    给出 n = 3, 返回 24
    可能的子集为 {{1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}
    子集的和为:
    1 + 2 + 3 + (1 + 2) + (1 + 3) + (2 + 3) + (1 + 2 + 3) = 24
    
    

    递归

    这是个数学题,找到规律就容易做了。
    我们从零开始看。


    看红色的,是每一个相对于上一个增加的子集,红色的把绿色的去掉就是上一个全部的子集,n的子集应该有一个n-1子集的两倍,还多了什么呢?就是多了很多个n,有多少个呢,就是n-1的子集数,这个值应该是2^n-1。看规律容易看来,另外也是可以推导的:
    n个自然数取组合数应该是:



    这个是高中学的,很简单,二项式定理。
    这样分析完之后写程序就简单了:

    int subSum(int n) {
            long long res=0;
            if(n==0)
                res=0;
            else 
                res=2*subSum(n-1)+n*pow(2,n-1);
            
            return res;
            // write your code here
        }
    

    递归当然是可以用循环写的:

     int subSum(int n) {
            long long res=0;
            
            if(n==0)
                res=0;
            else 
            for(int i=0;i<=n;i++)
            {
                res=2*res+i*pow(2,i-1);
            }
            
            return res;
            // write your code here
        }
    

    相关文章

      网友评论

        本文标题:730. 所有子集的和

        本文链接:https://www.haomeiwen.com/subject/yjlpaxtx.html